我很抱歉问初学者的问题。我无法获得“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
答案 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