2013-03-16 100 views
4

我有一個Club模型和一個會員模型,它們通過一個Membership模型關聯。換句話說保存模型時關聯「無效」

class Club < ActiveRecord::Base 
    has_many :members, :through => :memberships 
end 

class Member < ActiveRecord::Base 
    has_many :clubs, :through => :memberships 
end 

然而,當我試圖創建一個新的成員,並將其添加到一個俱樂部,我得到一個錯誤說,俱樂部是無效的。

> club = Club.find(1) 
> member = Member.new(:name => 'Member Name') 
> member.clubs << club 
> member.save 

member.save語句將返回false。望着member.errors.messages,我發現

> member.errors.messages 
@messages={:clubs=>["is invalid"]} 

真正奇怪的事情是不會發生這種情況了(使用sqlite3的)我的開發環境,但只能在使用MySQL的我EngineYard的部署。

+1

除了我下面的回答,你確定'club'被發現並且在它自己添加到'member.clubs'之前是有效的嗎? – 2013-03-16 21:52:55

+0

是的,俱樂部被發現並且有效。您可以毫無問題地以俱樂部身份登錄網絡應用程序。只有當俱樂部試圖添加會員時,問題纔會發生。 – 2013-03-16 22:16:48

+0

此外,我的演示俱樂部的種子數據加載正常。因此,關聯表就位並正常工作。它只是不會接受任何新的關聯。 – 2013-03-16 22:19:29

回答

7

我只是想出了我自己的問題。我的俱樂部類包含一個虛擬屬性:密碼,僅在創建俱樂部時使用,並且應該被忽略。事實證明,由於一個錯誤,密碼不會被忽略,並且在俱樂部協會被保存時正在驗證。所以吉姆斯圖爾特在他的評論中是正確的:俱樂部實際上是無效的,儘管我認爲它是有效的。

問題在開發中不會發生的原因是我在我的開發環境中關閉了密碼驗證,所以我可以用簡單的密碼進行測試。

+0

我遇到完全相同的問題。我甚至嘗試過'has_many:models,validate:false'但仍無法保存。任何其他想法? – user623396 2017-10-10 06:54:38

3

您是否在開發和生產中都有memberships表(即,您是否在全球運行rake db:migrate)?

您可能還需要修改您的模型是這樣的:

class Club < ActiveRecord::Base 
    has_many :memberships 
    has_many :members, :through => :memberships 
end 

class Member < ActiveRecord::Base 
    has_many :memberships 
    has_many :clubs, :through => :memberships 
end 

class Membership < ActiveRecord::Base 
    belongs_to :club 
    belongs_to :member 
end