2012-11-18 1 views
1

J'essaye de configurer un has_many avec conditions qui fonctionne bien pour la partie de lecture mais pas pour de nouvelles entrées. Je l'ai testé il y a quelques semaines dans un bac à sable et cela a fonctionné, mais je ne peux pas l'obtenir à nouveau travailler alors peut-être que je suis aveugle ou il est juste une mauvaise conception :-)Rails has_many avec la source et les conditions ne crée pas les attributs de condition

class Task 
    has_many :task_users 
    has_many :assignees, :through => :task_users, :source => :user, :conditions => {"task_users.is_assignee" => true} 
    has_many :participants, :through => :task_users, :source => :user 
end 

class TaskUser < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :task 
end 

class User 
    has_many :tasks 
end 

Après avoir ajouté un nouveau cessionnaire à une tâche comme celui-ci

Task.first.assignees << User.first 

l'instruction SQL suivante est exécutée

SQL (0.3ms) INSERT INTO `task_users` (`created_at`, `is_assignee`, `task_id`, `updated_at`, `user_id`) VALUES ('2012-11-18 15:52:24', NULL, 2, '2012-11-18 15:52:24', 3) 

Je pensais que les rails utiliseront mes conditions pour définir ces valeurs quand j'ajouter de nouveaux ing. La lecture fonctionne très bien mais je n'ai aucune idée pourquoi l'ajout de nouvelles valeurs ne fonctionne pas avec les conditions.

Je me attends ce INSERT

SQL (0.3ms) INSERT INTO `task_users` (`created_at`, `is_assignee`, `task_id`, `updated_at`, `user_id`) VALUES ('2012-11-18 15:52:24', 1, 2, '2012-11-18 15:52:24', 3) 
+0

Votre table de jointure appelé '' task_users' ou item_users'? Il semble que vous les utilisiez de façon interchangeable. Pourriez-vous clarifier? – cdesrosiers

+0

il est appelé 'task_users' juste mal saisi' task' avec 'items' parfois :( Correction de fautes de frappe dans mon message – Mike

Répondre

1

Je ne suis pas tout à fait sûr que vous pouvez spécifier :conditions hachage sur la table de jointure dans une association has_many :through. Quelqu'un d'autre me corrige si je me trompe, mais la condition doit être directement sur l'association source, :user dans votre cas.

Si tel est le cas, pour contourner cela, vous pouvez spécifier une association auxiliaire:

has_many :task_users 
has_many :assignee_task_users, :class_name => 'TaskUser', :conditions => {"is_assignee" => true} 
has_many :assignees, :through => :assignee_task_users, :source => :user 
+0

Wow, c'est ça Le premier test a fonctionné mais il faut creuser un peu plus tard cet après-midi – Mike

+0

Solution parfaite ! Merci – Mike

0

aller juste pour mettre en évidence la documentation:

Specify the conditions that the associated objects must meet in order to be 
included as a WHERE SQL fragment, such as price > 5 AND name LIKE 'B%'. 
Record creations from the association are scoped if a hash is used. 
has_many :posts, :conditions => {:published => true} will create published 
posts with @blog.posts.create or @blog.posts.build. 

même si vous avez utilisé un hachage déjà, le premier paramètre est une chaîne, qui est unneded être (l'association connaît déjà le nom de la table). réécrivez-le comme: conditions => {: is_assignee => true} et cela devrait fonctionner.

En outre, la façon dont vous créez des utilisateurs doit être réécrite pour que cela fonctionne bien sûr. Au lieu de:

Task.first.assignees << User.first 

utilisation:

Task.first.assignees.create 

et qui devrait faire l'affaire.

+0

J'ai essayé': conditions => {: is_assignee => true} 'hier et j'ai besoin de la table de jointure nom parce que j'utilise une 'source' J'ai essayé .create aussi, mais je n'arrive pas à le faire fonctionner – Mike

Questions connexes