Rails 3 - 更新3列连接表

时间:2012-10-02 20:30:32

标签: ruby-on-rails-3 activerecord

我有一个3列连接表,为3种不同的HABTM模型存储3个ID。

模型

# ProductGrade.rb
has_and_belongs_to_many :vendors, :join_table => "item_codes_product_grades_vendors"
has_and_belongs_to_many :item_codes, :join_table => "item_codes_product_grades_vendors"

# Vendor.rb
has_and_belongs_to_many :prouduct_grades, :join_table => "item_codes_product_grades_vendors"
has_and_belongs_to_many :item_codes, :join_table => "item_codes_product_grades_vendors"

# ItemCode.rb
has_and_belongs_to_many :vendors, :join_table => "item_codes_product_grades_vendors"
has_and_belongs_to_many :product_grades, :join_table => "item_codes_product_grades_vendors"

我只想在用户更新供应商模型时记录3部分关联。

Vendors_Controller.rb

def update
  i = ItemCode.find(params[:vendor][:item_codes].to_i)
  i.vendors << Vendor.find(params[:id])
  i.product_grades << ProductGrade.find(params[:product_grade_id])

  redirect_to product_grade_vendor_path
end

这正确地将3列数据保存在连接表中,但是它创建了两个不同的记录,如下所示:

-- *product_grade_id* -- *vendor_id* -- *item_code_id* --
---------------------------------------------------------
--                12  --       NULL  --             4  --
--                12  --          6  --           NULL --

我意识到这可能是一个愚蠢的语法问题,但我只是想知道如何让控制器将这两个值保存在1条记录中。

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

考虑使用has_many :through =>而不是HABTM。 ActiveRecord无法解决HABTM中的连接表,但它可以解决has_many :through =>中的连接表。使用后面的选项,连接表将表示为模型,您将获得工具如何操作,更改,更新等等。

我建议仅在加入两个模型时使用HABTM,而不是三个。您的更新方法将非常简化。

def update
  Association.create!(:product_grade_id => "...", :vendor_id => "...", :item_code_id => "..."

  redirect_to wherever_path
end