在基本RoR应用程序中保存has_and_belongs_to_many链接

时间:2011-06-21 08:19:14

标签: ruby-on-rails foreign-key-relationship has-and-belongs-to-many

我尝试学习我的2个新的简单模型产品和作者之间的has_and_belongs_to_many关系,其中产品可以有许多作者,作者可以拥有大量产品。

我写了这个:

class Author < ActiveRecord::Base
  has_and_belongs_to_many :products
end

class Product < ActiveRecord::Base
  has_and_belongs_to_many :authors
end

在产品的部分形式中,我有:

<p>Products</p>
<%= collection_select(:product, :author_ids, @authors, :id, :name, :prompt => " ",  :multiple => true) %>

但是当我点击更新按钮时,我收到这条奇怪的消息,我无法自行解决:

ProductsController#update中的NoMethodError undefined方法`reject'代表“1”:String

Rails.root:/ home / stephane / www / HABTM 应用程序跟踪|框架跟踪|完整追踪 app / controllers / products_controller.rb:63:in block in update' app/controllers/products_controller.rb:62:in update' 请求

参数: { “UTF8”=&gt;“中AOE“”,  “_method”=&gt; “中放”,  “authenticity_token”=&gt; “中2GlTssOFjTVZ9BikrIFgx22cdTOIJuAB70liYhhLf + 4 =”,  “product”=&gt; {“title”=&gt;“LetrésordesTempliers”,  “ORIGINAL_TITLE”=&gt; “中”,  “数量”=&gt; “中1”,  “added_by”=&gt; “中”,  “author_ids”=&gt; “中1”},  “commit”=&gt;“更新产品”,  “ID”=&gt; “中1”}

怎么了?有没有问题:product_ids ...我在互联网上看到我不得不说“s”但是我不确定它代表什么......

如何将表authors_products链接到下拉菜单返回的键? (此处“author_ids”=&gt;“1”) 谢谢!

更多信息: 可以用这个信息解决,但仍然没有保存关系:

collection_select("sales_agent", "customer_id", @customers, "id", "name")

假设您的客户模型具有ID属性和名称属性,这将产生上述代码。因此,查看我们传递给collection_select调用的值:

  • 第一个参数是包含集合中一个元素的模型(例如,sales_agent)
  • 接下来是模型中引用其包含的集合元素的字段名称(例如,customer_id)
  • 接下来是包含我们要列出的项目集合的变量(例如@customers)
  • 接下来是选项标签的值属性(例如,客户ID)
  • 接下来是选项标签的显示属性(例如,客户名称)

所以我现在写了

<p>Products</p>
<%= collection_select(:author, :author_id, @authors, :id, :name, :prompt => " ",  :multiple => true) %>

并且它有效,但暂时不保存链接...(仅保存正常字段的更新,而不是关系:-(

1 个答案:

答案 0 :(得分:2)

对于HABTM关系,您是否有一个名为author_products的单独模型?

您需要通过执行rails g model author_product之类的操作来运行其他迁移,并且该表应该只包含两个字段:

belongs_to :author
belongs_to :product

确保没有主键。

类似的东西:

  def self.up
    create_table(:author_products), :id => false do |t|
       t.references :author
       t.references :product
    end
  end