Rails 3 has_many:通过命名问题
问题描述:
好的,所以这里是交易。我有两个表和一个连接表,因为它是一个多对多的关系。我有一个订单,一个订单可以有很多产品。很显然,这是另一种方式,因为产品可以有很多订单。我有以下类:Rails 3 has_many:通过命名问题
class Order < ActiveRecord::Base
has_many :orders_products
has_many :products, :through => :orders_products
end
class OrderProduct < ActiveRecord::Base
belongs_to :order
belongs_to :product
end
class Product < ActiveRecord::Base
has_many :orders_products
has_many :orders, :through => :orders_products
end
我得到一个页面来显示,我能够进入的东西,当我去与保存的订单上的产品进行交互通过@order.products
我越来越以下错误:
SQLite3::SQLException: no such table: order_products: SELECT "products".* FROM "products" INNER JOIN "order_products" ON "products".id = "order_products".product_id WHERE (("order_products".order_id = 1))
我的连接表被命名为orders_products
,但你可以看到它试图通过order_products
加入。我对Rails命名惯例的有限了解告诉我,orders_products
是命名它的正确方法,然后将我的模型命名为OrderProduct
。我真的在我的头上撞墙。
编辑:我看到,即使它救了我的订单,而我选择了多个复选框,因为它是现在示数它没有保存任何值在orders_products
表,大概是出于同样的原因。
答
orders_products
是不是一个has_many :through
关系的正确的命名约定 - 这是正确的has_and_belongs_to_many
关系。在has_many :through
中,“加入”模型不仅仅用于加入 - 它也是它自己的模型,它有自己的数据,也发生加入其他两个模型在一起。
如果您的OrderProduct
模型没有它自己的任何数据,逻辑或约束,那么您可以使用has_and_belongs_to_many
关系代替,完全删除模型,然后将连接表命名为正确。否则,它会根据常规型号命名约定命名,即order_products
。
查看[本主题指南](http://guides.rubyonrails.org/association_basics.html#the-has_many-through-association)查看正确的`has_many:through`关联示例。 – 2011-02-06 06:23:40