Collection_Select 在下拉列表中显示多个字段

Collection_Select display multiple fields in dropdown

我正在使用连接到我的 Airports 模型的 collection_select。

领取

belongs_to  :departure_airport, :class_name => 'Airport', :foreign_key => 'd_airport_id'
belongs_to  :arrival_airport,   :class_name => 'Airport', :foreign_key => 'a_airport_id'

机场

has_many :claims

_form.html.erb

<%= collection_select :claim, :d_airport_id, Airport.order('name'), :id, :name, {:prompt => true} %>

当前下拉列表显示 "Manchester International Airport"(例如)但是我想包括来自同一模型的其他字段名称。

男人 |曼彻斯特国际机场 | EGCC(期望的结果)

MAN & EGCC 都是 Airport 模型中的列,恭敬地命名为 iata 和 icao。


我将继续只保存 airport_id,但是出于显示目的,下拉列表中的附加信息会很棒。

您可以使用要显示的格式化字符串向 Airport 模型添加一个方法。类似于:

def formatted_name
  "#{iata} | #{name} | #{icao}"
end

然后将该方法传递给 collection_select 而不是 :name。所以:

<%= collection_select :claim, :d_airport_id, Airport.order('name'), :id, :formatted_name, {:prompt => true} %>


请参阅文档 here。有问题的论点被称为 :text_method.

以下应该对您有所帮助:rails 4 -- concatenate fields in collection_select

基本上,您在 Airport 模型中创建一个新方法(在 models/Airport.rb 中):

def collection_select_nice_data
  "#{iata} | #{name} | #{icao}"
end

并且在 _form.html.erb 中使用新创建的 collection_select_nice_data:

<%= collection_select :claim, :d_airport_id, Airport.order('name'), :id, :collection_select_nice_data, {:prompt => true} %>