1

努力获得 has_many :through 关系与具有由单选按钮表示的关系的表单正常工作。

该关系描述了一个作业,该作业可以具有与之关联的各种元数据,并且这些元数据可以是不同的类型。这个模型背后的想法是,我最终将能够将其他元数据添加到其他类型的作业中,例如某种类别或价值的类别,而无需添加新表等。

在这种情况下,我有一个提交工作的表单,其中一个字段是工作类型(全职、兼职、咨询、自由职业),由四个单选按钮表示。

因此,当您保存在数据库中时,您将拥有相应的表:

jobs
 id - 1
 title - "Rails Developer"

jobs_metadata
 job_id - 1
 metadata_id - 1

metadata
 id - 1
 description - "Full Time"
 metadatum_type_id - 1

metadatum_types
 id - 1
 description - "Job Type"

以下是我的模型的摘要:

工作模式

class Job < ActiveRecord::Base
   has_many :jobs_metadata
   has_many :metadata, :through => :jobs_metadata

元数据(元数据的单数)模型

class Metadatum < ActiveRecord::Base
   has_one :metadata_type
   has_many :jobs_metadata
   has_many :jobs, :through => :jobs_metadata

JobMetadatum 模型<-- 我可能会在此表中添加其他字段,因此 :through

class JobsMetadatum < ActiveRecord::Base
   belongs_to :job
   belongs_to :metadatum

MetadataType 模型<-- 示例中不需要,但为了完整性而包含在内

class MetadataType < ActiveRecord::Base
   has_many :metadata

这是表示作业视图中单选按钮的代码

查看代码

<% @job_types.each do |job_type| %>
  <%= radio_button_tag("job[metadatum_ids]", job_type.id) %>
  <%= job_type.description %>&nbsp;
<% end %>

当我保存表单时 - 一切似乎都正确填充,但是当我切换到编辑模式时,未选中对应于 jobs_metadata 值的单选按钮。

所以我想我的问题是双重的:

  1. 我是否在上面正确定义了关系?我在做这种“Rails 方式”吗?
  2. 我是否正确定义了表单单选按钮 - 如果是这样,我如何让它们在从数据库读取时正确检查值?
4

1 回答 1

2

尝试在对 radio_button_tag 的调用中指定第三个选项以使其被选中:

<%= radio_button_tag("job[metadatum_ids]", job_type.id, true) %>

有关更多详细信息,请参见此处:http: //api.rubyonrails.org/classes/ActionView/Helpers/FormTagHelper.html#method-i-radio_button_tag

显然,您希望根据测试它是真实的,因此您可以在作业对象上定义方法,例如

def full_time?
  self.metadata.include?(Metadata.find(1))
end

进而:

<%= radio_button_tag("job[metadatum_ids]", job_type.id, job.full_time?) %>

我的例子可能不是你想要的,但你希望能明白。

于 2012-06-25T03:54:36.447 回答