2011-02-14 5 views
2


je les modèles suivantsRails 3: Many-to-Many relation avec la condition

class Project < ActiveRecord::Base 
    has_many :project_members 
    has_many :members, :through => :project_members, :uniq => true,:class_name => "User", :source => :user 
    has_many :admins, :through => :project_members, :uniq => true, :conditions => ['project_members.admin = ?', true], :class_name => "User", :source => :user 

end 

class User < ActiveRecord::Base 
    # References 
    has_many :project_members 
    has_many :projects, :through => :project_members 

end 

et la table de jointure

class ProjectMember < ActiveRecord::Base 
    belongs_to :project 
    belongs_to :user 
end 

Les relations semblent fonctionner, mais quand je veux ajouter un admin à un projet via ce code

project.admins.push(u) 
project.save 

(où vous êtes un utilisateur), il enregistre le nouveau relation, mais sans mettre admin à true dans la table de jointure.

Même si je récupère cette relation du projet et la mise en administration à true manuellement en faisant

project.project_members.first.admin = true 

et sauver le projet, il doens't mettre à jour l'attribut dans la table.

Qu'est-ce que je fais mal? (S'il vous plaît gardez à l'esprit que je suis un débutant total avec ruby ​​et rails)
J'ai été googling pour les dernières heures pour trouver une solution, mais ne pouvais rien trouver:/

+0

Ne vous attendez pas à trop de magie de la part de Rails. Sur "sauvegarder le projet, il ne met pas à jour l'attribut dans la table": les sauvegardes ne sont pas mises en cascade (elles ne le font que lors de la création). –

Répondre

2

Je pense que vous devez changer votre admins association à:

has_many :admins, :through => :project_members, :uniq => true, :conditions => {:project_members => {:admin => true}}, :class_name => "User", :source => :user 

J'espère que cela va vous aider.

+0

je l'ai déjà essayé, mais comme l'attribut admin est dans la table à travers et non dans la table des utilisateurs, il échoue avec l'erreur suivante: 'SQLite3 :: SQLException: pas de colonne: users.admin: SELECT « utilisateurs » * FROM. "utilisateurs" INNER JOIN "project_members" ON "utilisateurs" .id = "project_members" .user_id OU (("project_members" .project_id = 3) ET (("utilisateurs". "admin" = 't'))) LIMIT 1 ' – Hameno

+0

désolé utilisation: conditions => {: project_members => {: admin => true}} – jrichardlai

+0

Merci, qui fonctionne (comme ma version avant), mais il doens't encore mis à true admin si je fais' p .admins << utilisateur ». Ou cela ne fonctionnerait-il jamais automatiquement? Que devrais-je faire, pour pouvoir ajouter des admins comme celui-ci et l'attribut admin est automatiquement défini sur true? – Hameno

Questions connexes