0

3 つの異なる HABTM モデルの 3 つの ID を格納する 3 列の結合テーブルがあります。

モデル

# 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 列のデータが結合テーブルに正しく保存されますが、次のように 2 つの異なるレコードが作成されます。

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

これはおそらくばかげた構文の問題だと思いますが、コントローラーにこれらの値の両方を 1 つのレコードに保存させる方法を知りたいだけです。

助けてくれてありがとう!

4

1 に答える 1

1

has_many :through =>HABTM の代わりに使用することを検討してください。ActiveRecord は HABTM の結合テーブルに対応できませんが、.NET の結合テーブルに対応できますhas_many :through =>。後者のオプションを使用すると、結合テーブルがモデルとして表され、それを操作、変更、更新する方法などのツールが提供されます。

HABTM を使用するのは、3 つのモデルではなく 2 つのモデルを結合する場合のみにすることをお勧めします。更新方法は非常に単純化されます。

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

  redirect_to wherever_path
end
于 2012-10-03T16:11:52.000 に答える