2011-04-06 106 views
2

我有三個資源(稍微需要注意的是,用戶與Devise gem相關聯,因爲我認爲它們並不相關,所以我忽略了其中的詳細信息)Rails relationship.build不適用於多對多

用戶< - >成員身份< - >組

需要 '消化/ SHA2'

class User < ActiveRecord::Base 
    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable 

    attr_accessible :email, :password, :password_confirmation, :remember_me, :memberships_attributes 

    has_many :memberships 
    has_many :groups, :through => :memberships 
    attr_accessible :memberships 
    accepts_nested_attributes_for :memberships 
end 


class Membership < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :group 
    attr_accessible :user, :group 
end 


class Group < ActiveRecord::Base 
    has_many :memberships 
    has_many :users, :through=>:memberships 
end 

的問題是,構建沒有使用我提供的屬性,專門爲GROUP_ID。我粘貼調試的輸出:

(rdb:1903) @user.memberships.build(:group_id=>1) 
#<Membership id: nil, user_id: 5, group_id: nil, created_at: nil, updated_at: nil> 

我知道的關係/ ORM映射是很好的,因爲我可以這樣做:

(rdb:1903) @user.memberships.first.group_id=1 
1 
(rdb:1903) @user.memberships.first 
#<Membership id: nil, user_id: 5, **group_id: 1**, created_at: nil, updated_at: nil> 

我已經試過這一個簡單的has_many演示應用程序,它工作正常。


答:它是通過更新成員模型求解,有:

attr_accessible :user, :group, :group_id 
+0

此組是否存在(被保存)?在MTM關係中,必須先保存關聯的對象。 – kek 2011-04-06 13:33:23

+0

是的,它確實存在(rdb:1903)@ user.memberships.first.group #<組ID:1,標題:「默認」,created_at:「2011-03-22 12:27:52」,updated_at: 「2011-03-22 12:27:52」> – 2011-04-06 13:50:35

+0

你可以發佈你的完整模型的代碼爲每個模型,可能有別的干擾。 – 2011-04-06 16:37:32

回答

2

如果所有屬性的保護,你不能使用new大衆分配給他們,buildattributes=update_attributes。這可能會阻止您的group_id分配。

+1

我正在訪問group_id,並沒有在會員模型中。將以下內容添加到成員資格模型使其成爲attr_accessible:user,:group,:group_id – 2011-04-06 18:28:21