2010-11-16 45 views
1

爲了簡化問題,我有3個表:Ruby on Rails的 - 保存和與連接表更新的屬性有很多=>通過

的has_many:能力,通過=>:統計

能力

的has_many:人,通過=>:統計

統計

belongs_to的:人

belongs_to的:能力

統計有一個名爲 '評級' 的額外屬性。

我希望做的是進行編輯的人形式總是列出當前數據庫中的所有的能力,讓我指定每一個等級。

對於我的生活,我無法弄清楚如何做到這一點。我設法得到它像這樣的東西創建一個新用戶時工作:

(從人民控制器)

def new 
@character = Character.new 
    @abilities = Ability.all 
    @abilities.each do |ability| 
     @person.stats.build(:ability_id => ability.id) 
    end 
end 

From the people form: 

<% for @ability in @abilities do %> 
    <%= fields_for "person[stats_attributes]" do |t| %> 
<div class="field"> 
    <%= t.label @ability.name %> 
    <%= t.hidden_field :ability_id, :value => @ability.id, :index => nil %> 
    <%= t.text_field :rating, :index => nil %> 
    </div> 
    <% end %> 
    <% end %> 

這成功地讓我的能力與評級箱旁邊有一個列表,讓我保存他們,如果我正在創建一個新用戶。

問題是,如果我然後加載編輯表單(使用相同的表單部分),它不會帶回評級,如果我保存,即使具有完全相同的評級,它會創建重複條目統計信息表,而不是更新它。

我知道我是一個可怕的程序員,我可能這樣做了錯誤的方式,但我如何才能編輯表單召回分配給每個能力,該用戶的額定電流,其次我怎麼如果人和能力的組合已經存在,它會更新評分而不是重複評分?

回答

0

Railscasts情節196197展示如何在一個表格編輯多個模型。有實例顯示類似於你要做到這一點,可以幫助你什麼(同集上ascicasts:196197)。

1

難道不該

Character 
has_many :stats 
has_many :abilities, through => :stats 

Ability 
has_many :stats 
has_many :characters, through => :stats 

Stat 
belongs_to :character 
belongs_to :ability 

此外,它是人或人物嗎?你不同地提到兩者。 (我將在我的答案中與字符一起去)

我認爲你已經犯了「我會嘗試製作我的模式的簡化版本,以試圖說明問題,事情變得更加複雜,並且通過搞砸了這個問題,所以它沒有任何意義「綜合症。無論如何,我可以看到幾個問題:

1)首先,您要在創建角色後立即爲角色添加所有可能的功能。這很愚蠢 - 他們應該從默認開始沒有能力,然後創建連接表記錄(統計信息),以便他們做的擁有(通過勾選表單中的複選框)。在API http://railsbrain.com/api/rails-2.3.2/doc/index.html?a=M001885&name=has_many

在其他被稱爲「collection_ids =」 - 能力宏爲您提供:

2)一個簡單的方法來操縱加入的記錄,像這樣是利用了「ability_ids =」方法的的has_many也就是說,如果你說

@ character.ability_ids = [1,12,30]

那麼,這將使聯接和刪除角色和能力之間的任何其他加入該字符和能力1,12和30之間而不是在上面的列表中。與事實結合這在[]結束表單字段名稱實現其價值的一個數組,你可以做到以下幾點:

#controller 
def new 
@character = Character.new 
@abilities = Ability.all 
end 

#form 
<% @abilities.each do |ability| %> 
    <div class="field"> 
    <%= t.label @ability.name %> 
    <%= check_box_tag "character[ability_ids][]" %> 
    </div> 
<% end %> 

#subsequent controller (create action) 
@character = Character.new(params[:character]) #totally standard code 

請注意,有沒有提到的統計資料,在這裏所有。我們在角色和能力之間指定我們想要的關聯,並讓rails處理連接。

相關問題