Rails格式Collection_Select基于两个关系

时间:2013-02-02 12:06:21

标签: ruby-on-rails relationships rails-models

我正在试图弄清楚如何构建一个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将国家/地区的信息提取到一个选择中并将该条目附加到其父国?

我希望我能正确地说出这个问题!对不起,如果不清楚。

2 个答案:

答案 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