2010-09-21 85 views
5

在向連接表中添加屬性時,如何在has_many:through關聯中使用ActiveRecord的accept_nested_attributes_for幫助器?accep_nested_attributes_for通過連接表加入屬性

例如,假設我有一個團隊模式:

class Team < ActiveRecord::Base 
    role = Role.find_by_name('player') 
    has_many :players, 
      :through => :interactions, 
      :source  => :user, 
      :conditions => ["interactions.role_id = ?", role.id] do 
       class_eval do 
       define_method("<<") do |r|                
        Interaction.send(:with_scope, :create => {:role_id => role.id}) { self.concat r } 
       end 
       end 
      end 
end 

隊的has_many players通過interactions,因爲用戶可以佔據幾個角色(運動員,經理等)。

如何在使用accept_nested_attributes_for的同時向連接表添加屬性?

如果我有一個現有的球隊戰績team和現有的用戶記錄user,我可以做這樣的事情:

team.players << user 
team.players.size 
=> 1 

但是,如果我創建一個新的團隊,嵌套播放器:

team = Team.create(:name => "New York Lions", 
        :players_attributes => [{:name => 'John Doe'}]) 
team.players.size 
=> 0 

在最後一個例子中,創建了團隊,用戶和交互記錄(並且團隊確實通過交互使用戶),但這裏不設置interact.role_id屬性。

+0

您是否曾經解決過這個問題? – 2011-09-02 05:57:38

+1

您的問題的答案可以在這篇文章中找到:http://stackoverflow.com/questions/2182428/rails-nested-form-with-has-many-through-how-to-edit-attributes-of-join -模型 – 2011-10-06 20:57:52

回答

2
class Team < ActiveRecord::Base 
    accepts_nested_attributes_for :interactions 

class Interaction < ActiveRecord::Base 
    accepts_nested_attributes_for :players 


team = Team.create(:name => "New York Lions", :interactions_attribues => [{ 
        :players_attributes => [{:name => 'John Doe'}]}]) 

我沒有檢查創建,所以可能有陣列和散列有點搞砸了,但你明白了。您需要團隊中的accept_nested_attributes和交互模型。