我正在试图找出适合我的模型的ActiveRecord关联。我想创建一个非常准确的电子商务网站。我想拥有一个升级和修复产品的系统,因此访问用户的订单历史非常重要。
我目前的设置如下:
用户
has_many :products, :through => :orders
has_many :orders, :dependent => :destroy
订单
belongs_to :user
has_many :products
产品
belongs_to :orders
我的第一个问题是这有意义吗?我关注的是belongs_to:orders部分产品,因为我想确保产品可以成为许多不同订单的一部分(原因很明显)。如果这是错误/正确的,那么正确关系所需的必要迁移是什么?
提前致谢。
答案 0 :(得分:6)
我意识到这个帖子已经很老了但是由于我遇到了同样的问题,为追随者添加一些清晰度可能会很有趣。正如@ManojMonga在评论中所说,这里你需要使用has_and_belongs_to_many
关联。所以模型看起来像:
用户强>
has_many :orders, :dependent => :destroy
has_many :products, through: :orders
<强>顺序强>
belongs_to :user
has_and_belongs_to_many :products
<强>产品强>
has_and_belongs_to_many :orders
然后,如Active Record Association Rails Guide中所述,您需要创建一个连接表来保存订单和产品外键。迁移看起来像这样:
class OrdersProducts < ActiveRecord::Migration
def change
create_table :orders_products, id: false do |t|
t.belongs_to :order, index: true
t.belongs_to :product, index: true
t.timestamps
end
end
end
然后,在您运行迁移后,您将能够使用has_and_belongs_to_many methods。
请记住,当您创建连接表时,在has_an_belongs_to_many关联中,Active Record将查找以字母顺序连接的2个表名称命名的表。如果您希望以其他方式命名,则必须在模型中指定如下:
的订单强>
has_and_belongs_to_many :products, :join_table => "new_tables_name"
<强>产品强>
has_and_belongs_to_many :orders, :join_table => "new_tables_name"
最后,用户模型中的the has_many :products, through: :orders
不是必需的。它只允许通过用户访问产品。
就是这样,如果有任何帮助,我会很高兴的。我顺便使用Rails 4.1。
答案 1 :(得分:1)
产品has_one :order
。这将允许您使用@product.order
之类的内容,但它实际上不会在产品数据库表中为订单创建外键。