Rails 3.1 collection_select超过两个级别? (嵌套模型)

时间:2012-01-13 15:22:09

标签: ruby-on-rails

我很抱歉问初学者的问题。我无法获得“collection_select” 在特定情况下工作。

我正在尝试根据以下模型编写一个简单的Rails 3.1应用程序:

class Site < ActiveRecord::Base
     has_many :supply_sites, :dependent => :destroy
     has_many :demand_sites, :dependent => :destroy
     accepts_nested_attributes_for :supply_sites
     accepts_nested_attributes_for :demand_sites
end


class DemandSite < ActiveRecord::Base
   belongs_to :site, :class_name => "Site"
   has_many :translinks , :dependent => :destroy
end


class SupplySite < ActiveRecord::Base
   belongs_to :site, :class_name => "Site"
   has_many :translinks , :dependent => :destroy
end


class Translink < ActiveRecord::Base
  belongs_to :supply_site, :class_name =>  "SupplySite"
  belongs_to :demand_site, :class_name =>  "DemandSite"
end

迁移如下:

class CreateSites < ActiveRecord::Migration
  def self.up
    create_table :sites do |t|
      t.string :name
      t.string :codename, :limit => 3

      t.timestamps
    end
  end

  def self.down
    drop_table :sites
  end
end



class CreateSupplySites < ActiveRecord::Migration
  def self.up
    create_table :supply_sites do |t|
      t.integer :site_id
      t.float :supply_quantity

      t.timestamps
    end
  end

  def self.down
    drop_table :supply_sites
  end
end


class CreateDemandSites < ActiveRecord::Migration
  def self.up
    create_table :demand_sites do |t|
      t.integer :site_id
      t.float :demand_quantity

      t.timestamps
    end
  end

  def self.down
    drop_table :demand_sites
  end
end


class CreateTranslinks < ActiveRecord::Migration
  def self.up
    create_table :translinks do |t|
      t.integer :supply_site_id
      t.integer :demand_site_id
      t.float :unit_cost
      t.float :quantity

      t.timestamps
    end
  end

  def self.down
    drop_table :translinks
  end
end

我希望能够在a之间添加新的“translink”(Transportation Link) 通过从基于下拉列表的下拉菜单中选择“供应站点”和“需求站点” 相应供应站点或需求站点的代号,代号 被指定为“网站”。

添加新的“供应站点”(或“需求站点”)时,以下情况很有效 (来自“_form.html.erb”的供应站点或需求站点。

<div class="field">
    <%= f.label :site_id %><br />
    <%= f.collection_select :site_id, Site.find(:all), :id, :codename %>
  </div>

现在我想要添加一个新的“Translink”连接一个类似的东西 供应站点和需求站点。我不想添加相应的 手动提供supply_site_id或demand_site_id,但列出所有供应站点 通过底层站点中定义的代号选择一个,并且相同 需求点。我可以执行以下操作,以便有一个下拉菜单来选择现有供应站点中的一个:

<div class="field">
    <%= f.label :supply_site_id %><br />
    <%= f.collection_select :supply_site_id,  SupplySite.find(:all), :id, :id  %>
</div>

但是,我宁愿看到并选择底层“网站”的代号,而不是在下拉菜单中显示供应网站的ID。

<div class="field">
    <%= f.label :supply_site_id %><br />
    <%= f.collection_select :supply_site_id,  SupplySite.find(:all), :id ,????? %>
  </div>

我该怎么做?

非常感谢任何帮助!

的Stefan

2 个答案:

答案 0 :(得分:0)

检查formbuilder api中的fields_for方法。它允许您执行类似的操作以使用嵌套属性:

<%= f.fields_for(options) do |nested_f|
  nested_f.text_field :nested_attribute

答案 1 :(得分:0)

谢谢Katen!

解决方案结果是向需求站点类和供应站点类添加了一个方法,如下所示:

class SupplySite < ActiveRecord::Base
  belongs_to :site, :class_name => "Site"
  has_many :translinks , :dependent => :destroy
  accepts_nested_attributes_for :translinks


 def supply_site_codename
   self.site.codename
 end

class DemandSite < ActiveRecord::Base
    belongs_to :site, :class_name => "Site"
    has_many :translinks , :dependent => :destroy
    accepts_nested_attributes_for :translinks


  def demand_site_codename
     self.site.codename
  end

 end

这样我可以使用标准的“collection_select”并引用:底层“网站”的代号如下:

<div class="field">
   <%= f.label :supply_site_id %>
   <br/>
   <%= f.collection_select :supply_site_id, SupplySite.find(:all), :id,  supply_site_codename %>
 </div>

 <div class="field">
   <%= f.label :demand_site_id %>
   <br/>
    <%= f.collection_select :demand_site_id, DemandSite.find(:all), :id, :demand_site_codename %>
 </div>

现在它按预期工作。关键是要定义一个引用相应站点模型的方法。

的Stefan