3

所以我需要关于如何在多对多关系中设置 Rails 表单的建议,我在连接模型中保存额外的信息。

背景:我有两个模型,用户和技能。一个用户可以有很多技能;技能可以映射到许多用户。我有一个加入模型 SkillAssessment 来保存它,它保存了一个 user_id,skill_id。我希望能够在加入模型中保存用户在技能或技能级别上的表现。这可以采用 0-5 的整数值。

技能表预先填充了条目,因此在创建新用户时,我希望“技能”输入是一堆复选框。我不知道如何在复选框旁边添加一个字段,用户可以在其中输入他/她的技能水平。理想情况下,这将是一个下拉菜单,但这并不是非常重要。

这是它的外观图片:复选框在左侧,后面是一个标签,然后是一个额外的字段(文本输入,下拉......任何东西)来评估技能水平。

示范做什么

保存数据后,这些模型运行良好,但我不知道如何更改表单。如果只是节省技能,我会说:

 = f.input :skills, :label => _("Skills"), :as => :check_boxes, :collection => Skill.all

我怎样才能实现我在这里的目标?我想也许是 semantic_fields_for 之类的?

仅供参考,我使用苗条和形式,但知道haml和plain rails,因此非常感谢任何格式的建议!多谢你们

4

1 回答 1

0

您已经说过,一旦数据库中的所有内容都运行良好,所以我假设您已将模型设置为 a:has_many, :through而不是has_and_belongs_to_many. 如果没有,您需要这样做以将额外的属性保存到您的连接模型。

如果您还没有这样做,您将需要在您的用户模型中打开accepts_nested_attributes_for SkillsAssessments。

如果您正在使用attr_accessible,您还需要将skill_assessments_attributes可访问属性添加到您的用户列表中。

最终结果是您的用户模型如下所示:

models/user.rb
===============
class User < ActiveRecord::Base

has_many :skill_assessments
has_many :skills, :through => :skill_assessments

accepts_nested_attributes_for :skill_assessments

attr_accessible :user_field, ..., :skill_assessments_attributes

同样,如果您使用 attr_accessible,则需要确保您的 Skill_assessment 模型上的所有三个字段都是可访问的。

models/skill_assessment.rb
===========================
class SkillAssessment < ActiveRecord::Base

belongs_to :user
belongs_to :skill

attr_accessible :user_id, :skill_id, :skill_level

然后在您看来,您将拥有这样的东西(haml):

views/users/_form.html.haml
============================
= semantic_form_for @user do |f| 
  = f.input :user_field_1
  ...
  = f.input :user_field_n
  = f.semantic_fields_for :skill_assessments do |sa|
    = sa.input :skill_id, :label => "Skill", :collection => Skill.all
    = sa.input :skill_level, :label => "Proficiency", :collection => [1,2,3,4,5]
  = f.submit
于 2012-09-15T08:15:00.563 回答