Eri*_*ric 9 activerecord ruby-on-rails 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
Run Code Online (Sandbox Code Playgroud)
这是有用的:
observers = Course.find(37).observers
Run Code Online (Sandbox Code Playgroud)
这是不起作用的:
new_observer = Course.find(37).observers.build(:name => 'Joe Student')
Run Code Online (Sandbox Code Playgroud)
我原本以为可以使用该关联构建新记录,这将产生:
但相反,我得到:
ActiveRecord::AssociationTypeMismatch: Membership expected, got Array
Run Code Online (Sandbox Code Playgroud)
我确信我对此如何完全感到困惑,并会欣赏任何见解!我也尝试在Membership模型上使用命名作用域执行此操作,但我似乎无法使用has_many在关联中使用作用域.
非常感谢您提供任何帮助!
我相信你遇到了一个Rails错误.我在我的盒子上尝试了相同的东西(2.3.4)并且它给了我同样的错误,这似乎根本不对.另外我还尝试了以下方法:
course = Course.first
course.observers << Student.create(:name => "Joe Student")
course.save
Run Code Online (Sandbox Code Playgroud)
但这会创建一个观察者字段设置为false的成员资格!
我想出的最后一个丑陋的解决方法是Membership手动创建记录:
Membership.create!(:course => Course.first, :student => Student.first, :observer => true)
Run Code Online (Sandbox Code Playgroud)
我为此创建了一张票,我将在早餐后进一步调查.
编辑:我已按照承诺进一步调查并发现您是否将:conditions哈希更改为数组,例如:
:conditions => ["memberships.observer = ?", true]
Run Code Online (Sandbox Code Playgroud)
它按预期工作.我还有一个github存储库,其中包含示例代码和复制指令.