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 回答