通过控制台建立HABTM关联的最佳方式

时间:2015-06-08 13:01:14

标签: ruby-on-rails ruby

我有这种情况:

class Order < ActiveRecord::Base
  has_and_belongs_to_many :products
end

class Product < ActiveRecord::Base
  has_and_belongs_to_many :orders
end

class CreateJoinTableOrdersProducts < ActiveRecord::Migration
  def change
    create_join_table :orders, :products do |t|
      t.index [:order_id, :product_id]
      t.index [:product_id, :order_id]
      t.decimal :price, precision: 8, scale: 2
      t.integer :quantity, default: 1      
    end
  end
end

现在,我需要使用命令行添加一些记录:

这很好用:

Order.first.products << Product.first

但是,我需要添加更多字段,例如:pricequantity ...

我该怎么做?

1 个答案:

答案 0 :(得分:2)

Rails具有association.create.build方法,可让您即时创建关联模型:

Order.first.products.create(price: 999)

但正如@test指出,当连接表包含自己的数据时,您需要使用has_many_through而不是has_and_belongs_to_many

has_and_belongs_to_many用于直接的多对多关系。没有直接的方法可以在HABM关系中获取pricequantity等附加数据,该关系仅构建在具有已连接模型的ID的连接表上。 rails guides很好地解释了这一点。

class Order < ActiveRecord::Base
  has_many :row_items
  has_many :products, though: :row_items
end

class Product < ActiveRecord::Base
  has_many :row_items
  has_many :orders, though: :row_items
end

class RowItem < ActiveRecord::Base
  belongs_to :product
  belongs_to :order
end

您还需要创建正确的表格:

rails g migration CreateRowItem product:belongs_to order:belongs_to price:decimal ...

然后,您可以通过以下方式创建相关记录:

Order.first.row_items.create(price: 999, product: product)