2010-10-19 19 views
1

J'ai les modèles suivants:Comment puis-je faire une recherche dans Rails avec des conditions définies sur la table de jointure d'une association: through?

class User < ActiveRecord::Base 
    has_many :permissions 
    has_many :tasks, :through => :permissions 

class Task < ActiveRecord::Base 
    has_many :permissions 
    has_many :users, :through => :permissions 

class Permission < ActiveRecord::Base 
    belongs_to :task 
    belongs_to :user 

Je veux être en mesure d'afficher uniquement les tâches qu'un utilisateur a accès (à savoir, le drapeau read est réglé sur true dans le tableau Permissions). Je peux y arriver avec la requête suivante, mais il ne semble pas très Rails-y pour moi:

@user = current_user 
@tasks = @user.tasks.find_by_sql(["SELECT * FROM tasks INNER JOIN permissions ON tasks.id = permissions.task_id WHERE permissions.read = true AND permissions.user_id = ?", @user.id]) 

Quelqu'un sait la bonne façon de le faire?

Répondre

1

Répondant à ma propre question ici, Rails vous permet réellement de définir des conditions sur l'association elle-même. Ainsi, par exemple, dans mon modèle d'utilisateur, je modifie que has_many association soit:

has_many :tasks, :through => :permissions, :conditions => 'permissions.read = true' 

assez soignée. La solution proposée par Trip fonctionne également (sauf que, pour MySQL au moins, 'true' ne devrait pas être cité). Je jure que j'ai essayé celui-là ...!

0

Désolé, il s'agit d'une estimation rapide. Désolé si ce n'est pas correct.

@user.tasks.find(:all, :conditions => "permissions.read = 'true' ")