8

私は、学生がメンバーシップを使って登録できるコースを持っているとしましょう(例えば、コースと学生のhas_and_belongs_to_manyリレーションシップ)。いくつかのメンバーシップは、そう、ちょうど(ないなど、信用のために)クラスを観察している学生のためのものである:has_many:throughとhonor:条件で新しいレコードを作成するにはどうすればいいですか?

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つの関連付けを使用して新しいレコードを構築することができると思っているだろうし、それが生成されています:

  1. 新しい学生レコード( 'ジョー・学生')
  2. 新会員記録(Course_IDに= 37、STUDENT_ID =(ジョー)、オブザーバー=真)

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

ActiveRecord::AssociationTypeMismatch: Membership expected, got Array 

これはどうやって洞察力に感謝しているのですか?私はメンバーシップ・モデルで名前付きスコープでこれを実行しようとしましたが、has_manyを使用して関連付けのスコープを使用できないようです。

ご協力いただきありがとうございます!

答えて

6

あなたはRailsのバグに遭遇したと思います。私は同じことをボックス(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ていると私は朝食の後、さらに調査することがあります。

EDIT:私は、約束通り、さらに調査し、あなたのような配列にご:conditionsハッシュを変更した場合、発見した:意図したとおりにそれが動作する

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

。私はまた、github repositoryのコード例と複製する手順があります。

+0

ありがとうございます!非常に役立ちます!ああ、まだ100%ではありません。オブザーバブール値は、sql: c.observers.create!(:name => 'abby')=> 学生作成(2.0ms) "created_at")VALUES( 'abby'、 '2009-1 0-04 12:41:35'、 '2009-10-04 12:41:35') メンバーシップの作成(0。(NULL、 '2009-10-04 12:41:35'、4,2、0ms)INSERT INTO「メンバシップ」(「オブザーバ」、「updated_at」、「student_id」、「course_id」、「 created_at」) '2009-10-04 12:41:35') **オブザーバの値(NULL)に注意してください。 – Eric

+0

愚かな質問:この問題はまだ存在するのですか、レコードを作成するときにハッシュ条件が正常に機能していますか? ( 'observer:true'を設定します)。あるいはもっと良い方法があるかもしれません(私たちはレール4について話しています) –

関連する問題