HABTM在嵌套表单上具有额外属性

时间:2013-07-17 17:27:19

标签: ruby-on-rails nested-forms has-and-belongs-to-many

我的产品拥有并属于许多product_links

class Product < ActiveRecord::Base

has_many :map_product_prices
has_many :product_links, :through => :map_product_prices
accepts_nested_attributes_for :product_links

和...

class ProductLink < ActiveRecord::Base

has_many :map_product_prices
has_many :products, :through => :map_product_prices
accepts_nested_attributes_for :products

我正在使用Ryan Bates的'nested_form'宝石。这是我无法包裹大脑的问题。地图表还附有一个price属性。

class MapProductPrice < ActiveRecord::Base

attr_accessible :product_link_id, :product_id, :price

belongs_to :product
belongs_to :product_link

我有一个多选框,可以在产品链接表单上选择一个或多个产品。但是,当我切换到Ryans gem使用嵌套表单时,我可以有一个选择框来选择产品,然后是一个文本字段来输入价格。然后我可以根据需要添加/删除它们。

以下是我的看法:

    <%= f.fields_for :products do |product| %>
        <%= product.select :product_id, options_for_select(select_options) %>
        <%= product.text_field :price %>
        <%= product.link_to_remove "Remove this product" %>
    <% end %>
    <p><%= f.link_to_add "Add a product", :products %></p>

任何人对如何最好地完成此任务有任何想法?

我从这个表单得到的是产品没有product_id属性。这是有道理的,因为product_id在映射表上,而不是产品。那么如何在这个嵌套形式而不是产品中引用映射表呢?我不希望能够添加新产品,我希望能够在现有产品中添加新映射,并在每个映射旁边添加一个价格。

由于

编辑: 我编辑了我的代码以反映我尝试过的很多内容。当我查看视图时,它告诉我产品构建器对象上没有product_id或price属性。如何将此设计翻译成表格并使其有效?感谢

1 个答案:

答案 0 :(得分:0)

您需要从HABTM切换到has_many :through关系。 HABTM表只能有两个外键字段,has_many :through连接模型具有主键,您可以根据需要向连接模型添加任意数量的字段。

Rails指南:here

当您想要为您的联接模型使用has_many : through关系时,一个很好的例子就是为练习添加练习:

class Workout < ActiveRecord::Base

  has_many :workout_exercises, 
  has_many :exercises, :through => :workout_exercises

class WorkoutExercise < ActiveRecord::Base

  belongs_to :exercise
  belongs_to :workout

class Exercise < ActiveRecord::Base

  has_many :workout_exercises
  has_many :workouts, :through => :workout_exercises

因此,现在锻炼中的锻炼可以通过在连接表中添加权重字段来增加体重或其他任何与之相关的锻炼。