如何使用has_many:through和honor:conditions创建新记录?

时间:2009-10-03 21:13:51

标签: ruby-on-rails activerecord associations has-many-through

假设我有一个课程,学生可以通过会员注册(例如课程和学生的has_and_belongs_to_many关系)。有些会员资格是针对刚刚观看课程的学生(不是为了学分等),所以:

class Course < ActiveRecord::Base
  has_many :memberships

  has_many :students,
           :through => :memberships

  has_many :observers,
           :through => :memberships,
           :source => :student,
           :conditions => { :memberships => { :observer => true }}
end

这是有用的:

observers = Course.find(37).observers

这是不起作用的:

new_observer = Course.find(37).observers.build(:name => 'Joe Student')

我原本以为可以使用关联构建新记录,并且会生成:

  1. 新学生记录('Joe Student')
  2. 新会员记录(course_id = 37,student_id =(joe),observer = true)
  3. 但我得到了:

    ActiveRecord::AssociationTypeMismatch: Membership expected, got Array
    

    我确信我对此感到困惑,并会欣赏任何见解!我也尝试在Membership模型上使用命名作用域执行此操作,但我似乎无法使用has_many在关联中使用作用域。

    非常感谢您提供任何帮助!

1 个答案:

答案 0 :(得分:6)

我相信您遇到过Rails错误。我在我的盒子上尝试了相同的东西(2.3.4)并且它给了我同样的错误,这似乎根本不对。此外,我还尝试了以下方法:

course = Course.first
course.observers << Student.create(:name => "Joe Student")
course.save

但是这会创建一个成员资格,其观察者字段设置为 false

我想出的最后一个丑陋的解决方法是手动创建Membership记录:

Membership.create!(:course => Course.first, :student => Student.first, :observer => true)

created a ticket for this我将在早餐后进一步调查。

编辑:我已按照承诺进一步调查并发现您是否将:conditions哈希更改为数组,例如:

:conditions => ["memberships.observer = ?", true]

按预期工作。我还有github repository示例代码和重复说明。