1

読み取り部分では正常に機能するが、新しいエントリでは機能しないを設定しようとしてhas_manyいます。conditions数週間前にサンドボックスでテストしましたが、機能しましたが、再び機能させることができないため、盲目であるか、デザインが間違っている可能性があります:-)

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

このようなタスクに新しい担当者を追加した後

Task.first.assignees << User.first

次のSQLが実行されます

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)

新しい値を追加するときに、railsが条件を使用してこれらの値を設定すると思いました。読書はうまくいきますが、新しい値を追加しても条件がうまくいかない理由がわかりません。

私はこの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)
4

2 に答える 2

1

:conditionsアソシエーションの結合テーブルにハッシュを指定できるかどうかは完全にはわかりませんhas_many :through。私が間違っている場合は他の誰かが私を修正しますが:user、あなたの場合、条件はソース関連付けに直接ある必要があります.

この場合、これを回避するために、補助的な関連付けを指定できます。

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
于 2012-11-18T17:20:15.860 に答える
0

ドキュメントを強調表示するだけです。

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.

すでにハッシュを使用している場合でも、最初のパラメーターは文字列であり、これは必要ありません(関連付けはすでにテーブル名を知っています)。:conditions => {:is_assignee => true}と書き直すと、機能するはずです。

また、これが機能するためには、ユーザーの作成方法を書き直す必要があります。それ以外の:

Task.first.assignees << User.first

使用する:

Task.first.assignees.create

そしてそれはトリックを行う必要があります。

于 2012-11-18T17:09:46.337 に答える