我正在尝试构建一个使用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;。问题是这两者都来自入学的父母。基本上我需要遍历两个关联才能找到我想要的标签。
我考虑过去标准化,以便注册记录包含我需要的数据,但我宁愿不这样做。
有什么想法吗?
答案 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查询,请准备包含客户端和服务的注册集合。