我正在试图弄清楚如何构建一个collection_select来包含两个关系。这是我的模特:
class Country < ActiveRecord::Base
has_many :companies, :dependent => :destroy
end
class Company < ActiveRecord::Base
belongs_to :country
has_many :departments, :dependent => :destroy
end
class Department < ActiveRecord::Base
belongs_to :company
end
当我创建新公司时,我使用以下内容显示基于关系的选择框。
<%= collection_select(:company, :country_id, Countries.all, :id, :name, :prompt => 'Please select country') %>
但对于部门我想要一个选择,让用户从包含公司国家/地区的选择中选择它的公司,格式如下:
公司1 - 国家1 公司2 - 国家1
如果我使用以下内容,我将只列出我希望从列表中看到的所有公司的列表。
<%= collection_select(:device, :cabinet_id, Cabinet.all, :id, :name, :prompt => 'Please select cabinet') %>
有没有办法让rails将国家/地区的信息提取到一个选择中并将该条目附加到其父国?
我希望我能正确地说出这个问题!对不起,如果不清楚。
答案 0 :(得分:2)
即使@jvnil解决方案有效,我认为您应该避免将此逻辑放在您的视图中。
相反,您可以在Company
模型中创建实例方法,并在您的选择中使用它。
在你的模特中:
class Company< ActiveRecord::Base
def name_for_select
name + " - " + country.name
end
end
在你看来:
<%= collection_select(:department, :company_id, Company.all, :id, :name_for_select %>
答案 1 :(得分:1)
使用
更新:将逻辑代码移至模型
# company.rb
def company_with_country
"#{name} - #{country.name}" # this is better than using `string + string` since it creates only 1 string
end
# view
collection_select :department, :company_id, Company.includes(:country).all, :id, :company_with_country
更新:更快的版本,因为它只使用所需的列
# controller
@companies = Company.joins(:country)
.select('companies.id, companies.name, countries.name AS country_name')
.map { |c| ["#{c.name} - #{c.country_name}", c.id] }`
# view
select :department, :company_id, @companies