0

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

我目前的设置如下:

用户

has_many :products, :through => :orders

has_many :orders, :dependent => :destroy

订单

belongs_to :user

has_many :products

产品

belongs_to :orders

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

提前致谢。

4

2 回答 2

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 方法。请记住,当您创建连接表时,在 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。

于 2015-08-24T14:40:37.937 回答
1

产品has_one :order。这将允许您使用类似的东西@product.order,但它实际上不会为产品数据库表中的订单创建外键。

于 2013-02-10T23:53:41.980 回答