2013-08-21 4 views
0

J'ai matériaux:Comment écrire la requête ActiveRecord suivante?

  • appartiennent à un utilisateur: user_id:
  • peuvent être maîtres ou versions: Statut:
  • peut avoir un parent_id si une version: parent_id: (note: si c'est un maître le parent_id sera nul)

Je veux obtenir tous les matériaux qui:

a) appartiennent à un utilisateur b) ne sont pas des versions à moins que le parent_id de la version ne fait pas partie des ids des maîtres

Comment puis-je faire ce genre de requête?

Répondre

1

Je ne sais pas si je vous ai bien compris. Cela vous donnera les matériaux de base ou (matériaux de version qui ne sont pas les enfants d'un maître de l'utilisateur) pour un utilisateur donné.

master_ids = certain_user.materials.where(status: 'master').pluck(:id) 
certain_user.materials.where("status = ? OR parent_id NOT IN (?)", 'master', master_ids) 

Si vous n'avez pas accès à une instance de l'utilisateur il suffit de remplacer certain_user.materials avec Material.where(user_id: the_id_of_the_user)

0

Essayez ces ...

a)Material.joins(:users).merge(User.where(field: value)) 

b)Material.where("parent_id IS NOT NULL and parent_id not in (?)", Material.pluck(:id)) 
Questions connexes