Rails:来自祖父母的简单表格关联label_method

时间:2015-03-17 22:53:05

标签: ruby-on-rails simple-form model-associations

我正在尝试构建一个使用Simple Form创建新记录的表单,但是我在下拉列表中显示正确的标签时遇到问题。一,相关模型:

class Service < ActiveRecord::Base
  belongs_to :business
  has_one :enrollment
  has_many :clients, through: :enrollment
end

class Client < ActiveRecord::Base
  belongs_to :business
  has_one :enrollment
  has_many :services, through: :enrollment
end

class Enrollment < ActiveRecord::Base
  belongs_to :service
  belongs_to :client
  has_many :jobs
end

class Job < ActiveRecord::Base
  belongs_to :enrollment
end

基本思想是客户将注册一个或多个服务。作业代表执行服务的约会。创建新作业时,我需要选择作业所属的注册。来自html.erb:

<%= f.association :enrollment, label_method: :service_id, value_method: :id, prompt: 'Choose an enrolled service' %>

这种方法很有效,但它只显示了Enrollment表中的service_id。我想看到的是客户端的名称(fname和lname)以及下拉列表中连接的服务名称,如下所示:&#34; John Doe:Window Washing&#34;。问题是这两者都来自入学的父母。基本上我需要遍历两个关联才能找到我想要的标签。

我考虑过去标准化,以便注册记录包含我需要的数据,但我宁愿不这样做。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

在Enrollment类中定义以下方法:

def name
  "#{client.full_name}: #{service.name}"
end

然后您应该能够在表单中使用此方法:

<%= f.association :enrollment, label_method: :name, value_method: :id, prompt: 'Choose an enrolled service' %>

要避免2 * n + 1个sql查询,请准备包含客户端和服务的注册集合。