8

假设我有一门课程,学生可以通过其成员注册(例如,课程和学生的has_and_belongs_to_many relationsip)。有些成员是学生谁只是观察类(不适用于信用卡等),所以:如何使用has_many创建新记录:through和honor:conditions?

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. 一个新的学生记录(“乔学生)
  2. 新会员的记录(COURSE_ID = 37,student_id数据=(JOE),观察者= TRUE)

而是我得到:

ActiveRecord::AssociationTypeMismatch: Membership expected, got Array 

我敢肯定,我完全不知道这件事,并会欣赏任何见解!我也尝试在Membership模型上使用命名范围来做到这一点,但我似乎无法得到has_many在关联中使用范围。

非常感谢您的帮助!

回答

6

我相信你遇到了一个Rails的bug。我在我的盒子(2.3.4)上尝试了同样的东西,它给了我同样的错误,看起来并不正确。此外,我也尝试了变通的:

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

但这创建与观测场组成员资格,

最终的解决办法丑,我想出了手动创建Membership记录:

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

我已经created a ticket for this,我会进一步早餐后展开调查。

编辑:我已经按照承诺进一步调查,如果你改变你的:conditions散列数组如发现:

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

它按预期工作。我也有一个github repository与示例代码和说明复制。

+0

谢谢!!很有帮助!唉,仍然不是100%。 sql: c.observers.create!(:name =>'abby')=> 学生创建(2.0ms)INSERT INTO“students”(“name”,“updated_at”, “created_at”)VALUES('abby','2009-1 0-04 12:41:35','2009-10-04 12:41:35') Membership Create(0。0)INSERT INTO“memberships”(“observer”,“updated_at”,“student_id”,“course_id”,“ created_at”)VALUES(NULL,'2009-10-04 12:41:35',4,2, '2009-10-04 12:41:35') **请注意观察者的值(NULL)。 – Eric 2009-10-04 12:48:01

+0

愚蠢的问题:这个问题仍然存在或散列条件工作正常时建立一个记录? (设置'observer:true')。或者也许有更好的方法(我们正在谈论rails4) – 2014-03-24 14:33:31

相关问题