0

2つの関係を含めるために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がその国の情報を選択して、その親国のエントリを追加する方法はありますか?

私はこの質問を正しく表現したことを願っています!はっきりしない場合は申し訳ありません。

4

2 に答える 2

2

@jvnilソリューションが機能する場合でも、このロジックをビューに含めることは避けるべきだと思います。代わりに、Companyモデルにインスタンスメソッドを作成し、それをselectで使用できます。

あなたのモデルでは:

class Company< ActiveRecord::Base
  def name_for_select
    name + " - " + country.name
  end
end

そしてあなたの見解では:

<%= collection_select(:department, :company_id, Company.all, :id, :name_for_select %>
于 2013-02-02T14:53:40.500 に答える
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
于 2013-02-02T13:07:37.220 に答える