产品,订单和客户Rails协会

时间:2013-02-10 23:50:07

标签: ruby-on-rails activerecord associations

我正在试图找出适合我的模型的ActiveRecord关联。我想创建一个非常准确的电子商务网站。我想拥有一个升级和修复产品的系统,因此访问用户的订单历史非常重要。

我目前的设置如下:

用户

has_many :products, :through => :orders

has_many :orders, :dependent => :destroy

订单

belongs_to :user

has_many :products

产品

belongs_to :orders

我的第一个问题是这有意义吗?我关注的是belongs_to:orders部分产品,因为我想确保产品可以成为许多不同订单的一部分(原因很明显)。如果这是错误/正确的,那么正确关系所需的必要迁移是什么?

提前致谢。

2 个答案:

答案 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之类的内容,但它实际上不会在产品数据库表中为订单创建外键。