如何使用has_many创建新记录:through和honor:conditions?
问题描述:
假设我有一门课程,学生可以通过其成员注册(例如,课程和学生的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')
我本来以为,人们可以利用联想建立新的记录,将已生成:
- 一个新的学生记录(“乔学生)
- 新会员的记录(COURSE_ID = 37,student_id数据=(JOE),观察者= TRUE)
而是我得到:
ActiveRecord::AssociationTypeMismatch: Membership expected, got Array
我敢肯定,我完全不知道这件事,并会欣赏任何见解!我也尝试在Membership模型上使用命名范围来做到这一点,但我似乎无法得到has_many在关联中使用范围。
非常感谢您的帮助!
答
我相信你遇到了一个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与示例代码和说明复制。
谢谢!!很有帮助!唉,仍然不是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
愚蠢的问题:这个问题仍然存在或散列条件工作正常时建立一个记录? (设置'observer:true')。或者也许有更好的方法(我们正在谈论rails4) – 2014-03-24 14:33:31