10

假设我有一门课程,学生可以通过会员资格注册(例如课程和学生的 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. 新的学生记录(“乔学生”)
  2. 新的会员记录(course_id = 37,student_id = (joe),observer = true)

但相反,我得到:

ActiveRecord::AssociationTypeMismatch: Membership expected, got Array

我敢肯定,我对此完全感到困惑,并希望有任何见解!我也尝试在 Membership 模型上使用命名范围来执行此操作,但我似乎无法让 has_many 在关联中使用范围。

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

4

1 回答 1

7

我相信你遇到过 Rails 的 bug。我在我的盒子(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)

为此创建了一张票,早餐后我将进一步调查。

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

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

它按预期工作。我还有一个github 存储库,其中包含示例代码和复制说明。

于 2009-10-03T22:49:14.990 回答