【发布时间】:2010-06-14 05:12:15
【问题描述】:
我已经设法在以下模型之间建立了多对多关系
- 字符
- 技能
- 玩家技能
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”之后,我需要它打印一个更新 player_skill 的 text_field。
当然,问题在于 player_skill 可能存在也可能不存在! (取决于您在加载表单时是否已经勾选了该框!)
从我读过的所有内容来看,has_many :through 很棒,因为它允许您将关系本身视为一个实体......但我完全不知道如何处理这种形式的实体。
与往常一样,提前感谢您给予我的任何帮助!
【问题讨论】:
标签: ruby-on-rails activerecord many-to-many