Ruby on Rails:如何更改collection_select下拉列表中的外键值?

时间:2014-07-25 03:05:27

标签: ruby-on-rails ruby ruby-on-rails-3

我的表单上有一个下拉列表,它是另一个表的外键:

<div class="field">
    <td><%= f.label "#{column_name}" %></td>
    <td><%= f.collection_select "#{column_name}", Table.all, :id, :message_id %></td>
</div>

&#34;表&#34;有一列&#34; message_id&#34;这是一个不同表的foreign_key&#34;消息&#34;。

&#34;消息&#34; table包含我的应用程序中的所有文本/字符串。

当我在我的页面上加载此代码时,它会给我一个所有记录的下拉列表,但它只显示指向&#34;消息&#34;的外键ID号。表

如何更改下拉列表中的外键ID号码以切换我在Messages表上的消息内容?

2 个答案:

答案 0 :(得分:0)

试试这个: f.input "#{column_name}", :collection => Table.all.collect {|t| [Messages.find(t.message_id).message_content , t.id]}

这不是很有效,但我认为会做这项工作。

答案 1 :(得分:0)

只需在Table模型中创建一个方法,该方法从相关的Messages中获取所有Message内容。像:

#table.rb

    def message_content
        self.message.message_content #a trip to the database every select iteration over Table.all
    end

当然,这不是很好的性能(看看所有这些行程到DB)。因此,您可以使用before_save挂钩将消息内容与表记录关联:

    #table.rb
    before_save :associate_message_content

    def associate_message_content
      unless message.nil?
        self.message_content = message.message_content
      end       
    end     

    def message_content
        self.message_content #no trips to the database
    end

在你的选择中只需调用方法:

#view
<div class="field">
    <td><%= f.label "#{column_name}" %></td>
    <td><%= f.collection_select "#{column_name}", Table.all, :id, :message_content %></td>
</div>