8

假設我有一門課程,學生可以通過其成員註冊(例如,課程和學生的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') 

我本來以爲,人們可以利用聯想建立新的記錄,將已生成:

  1. 一個新的學生記錄(「喬學生)
  2. 新會員的記錄(COURSE_ID = 37,student_id數據=(JOE),觀察者= TRUE)

而是我得到:

ActiveRecord::AssociationTypeMismatch: Membership expected, got Array 

我敢肯定,我完全不知道這件事,並會欣賞任何見解!我也嘗試在Membership模型上使用命名範圍來做到這一點,但我似乎無法得到has_many在關聯中使用範圍。

非常感謝您的幫助!

回答

6

我相信你遇到了一個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與示例代碼和說明覆制。

+0

謝謝!!很有幫助!唉,仍然不是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

+0

愚蠢的問題:這個問題仍然存在或散列條件工作正常時建立一個記錄? (設置'observer:true')。或者也許有更好的方法(我們正在談論rails4) – 2014-03-24 14:33:31

相關問題