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. 新しい Student レコード ('Joe Student')
  2. 新しいメンバーシップ レコード (course_id = 37、student_id = (joe)、observer = true)

しかし、代わりに私は得る:

ActiveRecord::AssociationTypeMismatch: Membership expected, got Array

私はこれについて完全に混乱していると確信しており、洞察をいただければ幸いです! また、メンバーシップ モデルの名前付きスコープを使用してこれを実行しようとしましたが、関連付けで has_many にスコープを使用させることができないようです。

可能な限り助けてくれてありがとう!

4

1 に答える 1

7

Rails のバグに遭遇したと思います。私のボックス(2.3.4)で同じことを試してみましたが、まったく正しくないように見える同じエラーが表示されます。さらに、次の回避策も試しました。

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

しかし、これにより、observer フィールドがfalseに設定されたメンバーシップが作成されます。

私が思いついた最後の醜い回避策は、Membershipレコードを手動で作成することでした:

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

このチケットを作成しました。朝食後にさらに調査します。

編集:約束どおり、さらに調査したところ、:conditionsハッシュを次のような配列に変更したかどうかがわかりました。

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

意図したとおりに機能します。また、サンプル コードと複製手順を含むgithub リポジトリもあります。

于 2009-10-03T22:49:14.990 に答える