2013-02-01 55 views
0

我有3個表格:超級英雄,權力,團隊rails 3來自不同控制器的更新模型

超級英雄可以有很多權力和許多團隊。

例如:

superhero.rb 
    name:string 

    has_many :power_teams, :dependent => :destroy 
    has_many :powers, :through => :power_teams, :foreign_key => :power_id 
    has_many :teams, :through => :power_teams, :foreign_key => :team_id 

power.rb 
    name:string 
    has_many :power_teams, :dependent => :destroy 

team.rb 
    name:string 
    has_many :power_teams, :dependent => :destroy 

#This is what I want to add to 
power_team 
    belongs_to :superhero 
    belongs_to :power 
    belongs_to :team 

更新在這裏是爲超級英雄控制器

def create 
    @hero = Superhero.new(params[:hero]) 

形式:

<%= form_for(@hero) do |f| %> 

    <%= f.label :name %><br /> 
    <%= f.text_field :name %> 

    #Teams are a drop-down, you can only choose 1 team 
    <%= f.collection_select(:team_ids, Team.all(:order=>:name), :id, :name, {:prompt => true}) %> 

    #powers are checkboxes, you can choose multiple powers 
    <% Power.all.each do |power| %> 
    <label class="checkbox"> 
    <%= check_box_tag "superhero[power_ids][]", power.id, @hero.power_ids.include?(power.id) %> 
    <%= power.name %> 
    </label> 
    <% end %> 
<% end %> 

當我保存,1隊和2個權力我得到這個(在索引頁):

Hero | Power | Team 
    1  1  
    1  2 
    1    1 

這是正確的嗎?我以爲我會看到並期待這樣的:

Hero | Power | Team 
    1  1  1 
    1  2  1 
+0

如你剛纔提到的那樣,你需要使用after_save鉤子的可能性很低, 。這似乎是錯誤的:'@power_team = PowerTeam.new(params [:power_ids] [:team_ids])',因爲它會假設請求參數'power_id'可以使用鍵':power_ids'訪問,並返回一個散列用一個關鍵字':team_ids',這幾乎肯定不是這種情況。另外,如果沒有使用的模式或表單代碼等,它需要大量的假設和猜測才能提供幫助,因此可能有助於將該信息添加到您的問題中。 –

回答

0

你說你要創建的權力和球隊之間的關係,並power_team目前只宣佈對動力的關聯。如果你已經TEAM_ID在power_teams表,那麼你或許應該有這樣的power_team模式也:

belongs_to :team 

這也許不是唯一的問題。由於您僅對模型進行了部分定義,沒有定義您的模式,並且未提供用於嘗試更新的表單等代碼,因此很難說。

確保您在每個模型中都設置了關聯,並且該關聯的定義匹配。如果模型的表中有外鍵列,或者has_one/has_many(取決於您期望返回的記錄數),則使用belongs_to;如果它是爲該模型定義了外鍵列的關聯模型的表, has_and_belongs_to_many(又名「HABTM」)如果您有一個連接表,只有有兩列 - 一個用於連接兩個表的每個外鍵。看起來你已經爲少數人完成了依賴銷燬,所以不需要提及這一點。如果您使用的是舊式架構,那麼如果您在關聯的任一側使用非標準表名稱,則使用非標準連接表名稱,非標準外鍵列名稱和/或ID或非標準模型類名稱,那麼您需要爲關聯的兩側正確設置關聯的其他選項。

即使您在註釋中指出質量指派安全性不是問題,但請確保您希望更新關聯對象(並且假設您使用的是Rails 3.1+,其中包含質量指派安全性和白名單,這是默認設置最新的3.2.x),您將_attributes添加到attr_accessible中定義的屬性名稱的末尾,以表示您正在接受嵌套屬性。在Rails 4中,大規模分配安全性正在消失,所以如果您對使用strong_parameters有興趣,那麼現在是研究這個和其他新Rails 4技術(rails-api,ActiveModel :: Serializer等)的好時機。可目前的Rails 3中使用

更新:

由於問題進行了更新,我看到現在的超級英雄有一個協會,power_teams,反之亦然。無論是超級英雄還是power_team,這種關聯都是不必要的,所以我會刪除它。在問題中似乎仍然存在一些控制器丟失的代碼,因爲它應該在加載創建表單時路由到「新」操作方法,以及接受表單提交的「創建」操作方法,所以在那裏至少應該有兩種稱爲「新建」和「創建」的方法。開始一個新項目並使用rails生成腳手架方法來獲得最初的東西,這是一個好主意,因爲現在你已經擁有了架構(我剛剛提到的這個變化是爲了將超級英雄關聯移除到power_team,反之亦然) 。我知道你基於其他問題對Rails並不陌生,但僅以基準爲例,它總是很好:http://guides.rubyonrails.org/getting_started.html

+0

我試過這個,但我不認爲它與大規模任務安全有關,我試圖更新一個單獨的關係模型。我有模型超級英雄更新團隊和權力(superhero_team,superhero_power)的嵌套關係,我想要做的就是從同一個查詢更新power和team之間的關係表(power_team)。問題是,超級英雄與(power_team)表 – jmorrissette

+0

沒有任何關係。更新了答案,以表明我假設你想在power_team模型上使用'belongs_to:team',雖然很難說,因爲我不'不知道模式是什麼樣子。希望有所幫助。 –

+0

@ gary-s-weaver感謝您的評論,我已經改變了關係模型,我放棄了superhero_team和power_superheros並創建了一個3個belongs_to的power_superhero_team團隊表,我有一種工作方式。問題是我得到這個保存:(圖片作爲表(標題)超級英雄團隊力量(第1行)[1,1,空白](第2行)[1,空白,2]。我想要的是[1, 1,2] – jmorrissette

相關問題