可以使用Collection_Select从同一表单中的多个变量的参考模型生成相同的下拉列表吗?

时间:2011-08-19 22:26:07

标签: mysql ruby-on-rails collections migration reference

我认为这个问题的第一个版本过于复杂,并且证明了解决问题的不正确尝试。请考虑此假设迁移文件中的模型:

class CreateProjects < ActiveRecord::Migration
  def self.up
    create_table :projects do |t|
      t.references :oem1
      t.references :oem2
      t.references :oem3

      t.timestamps
    end
  end

  def self.down
    drop_table :projects
  end
end

此计划有必要:

  1. 允许用户从制造商的下拉列表中为oem1,oem2和oem3分配值。
  2. 允许管理员或高级用户在用户选择的列表中添加或删除值。
  3. 通过创建此迁移文件中显示的模型,可以轻松实现第二个目标:

    class CreateOems < ActiveRecord::Migration
      def self.up
        create_table :oems do |t|
          t.string :name
    
          t.timestamps
        end
      end
    
      def self.down
        drop_table :projects
      end
    end
    

    如果我在PROJECTs模型中没有三个独特的OEM变量,我只需要 PROJECT:belongs_to oems OEM:has_many项目,然后使用 collection_select 从OEM模型中选择OEM名称,并将其分配给PROJECTs模型中的OEM参考变量。但是,我有三个OEM变量,它们不能全部命名为OEM。所以,据我所知,我无法将所有这三个变量链接到collection_select下拉列表中的OEM.name变量。

    那么,我该怎么办?还有另一种方法来实现这两个目标吗?

2 个答案:

答案 0 :(得分:1)

我想我可能会误解你,但你是说这不起作用吗?

- oems = Oem.all

= collection_select(:project, :oem1, oems, :id, :name, :prompt => true)
...
= collection_select(:project, :oem2, oems, :id, :name, :prompt => true)
...
= collection_select(:project, :oem3, oems, :id, :name, :prompt => true)

答案 1 :(得分:1)

在表单中,您可以执行以下操作:

<%= form_for @project do |f| %>
  <p>
    <%= f.label :oem1 %>
    <%= f.collection_select :oem1, Oem.all, :name, :name %>
  </p>
  <p>
    <%= f.label :oem2 %>
    <%= f.collection_select :oem2, Oem.all, :name, :name %>
  </p>
  <p>
    <%= f.label :oem3 %>
    <%= f.collection_select :oem3, Oem.all, :name, :name %>
  </p>

  <!-- The rest of your form... -->
<% end -%>

不确定您的要求,但听起来项目和oems之间的关系是多对多的。那么,如何使用has_and_belongs_to_many