我已经成功地建立了许多一对多以下车型之间的关系更新附加属性的的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