我已經成功地建立了許多一對多以下車型之間的關係更新附加屬性的的has_many,:使用Rails
- 通過人物關係
- 技能
- PlayerSkills
玩家技能,現在,有一個屬性,技能通常不具有:一級。
該機型是這個樣子(編輯爲簡潔起見):
class PlayerSkill < ActiveRecord::Base
belongs_to :character
belongs_to :skill
end
class Skill < ActiveRecord::Base
has_many :player_skills
has_many :characters, :through => :player_skills
attr_accessible :name, :description
end
class Character < ActiveRecord::Base
belongs_to :user
has_many :player_skills
has_many :skills, :through => :player_skills
end
所以沒有在模型過於花哨...... 控制器也是在這一點上是非常基本的...這是一個很值得股票更新行動。
我正在修改的表單是characters#edit。 現在它呈現一系列複選框,可以在角色中添加/刪除技能。 這很好,但是使用has_many:through的全部意義還在於跟蹤「級別」。
這是我到目前爲止有:
- form_for @character do |f|
= f.error_messages
%p
= f.label :name
%br
= f.text_field :name
%p
= f.label :race
%br
= f.text_field :race
%p
= f.label :char_class
%br
= f.text_field :char_class
%p
- @skills.each do |skill|
= check_box_tag "character[skill_ids][]", skill.id, @character.skills.include?(skill)
=h skill.name
%br
%p
= f.submit
它呈現「skill.name」後,我需要它來打印text_field的更新player_skill。
問題當然是,player_skill可能存在也可能不存在! (取決於當你裝入表格時盒子是否已經打勾!)
從我讀過的所有東西,has_many:通過是偉大的,因爲它允許你把關係本身看作一個實體......但是,完全不知道如何處理這種形式的實體。
一如既往,在此先感謝您爲我提供的任何和所有幫助!
我想說明的是,您必須修改pre_update方法,以獲得所需的連接模型上的每個額外屬性。這顯然不理想。 – Robbie 2010-06-17 23:31:33
你可以在集合上使用'fields_for'。它節省了大量的實現細節。 – hurikhan77 2010-10-10 00:42:03
...和訂購問題。 – hurikhan77 2010-10-10 00:50:01