我有这种情况:
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
但是,我需要添加更多字段,例如:price
,quantity
...
我该怎么做?
答案 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关系中获取price
或quantity
等附加数据,该关系仅构建在具有已连接模型的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)