好的,所以这是交易。我有两个表和一个连接表,因为它是一个多对多的关系。我有订单,订单可以有很多产品。显然,它是另一种方式,因为产品可以在许多订单上。我有以下课程:
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
表中保存任何值,大概是因为它现在错误的原因。
答案 0 :(得分:27)
orders_products
不是has_many :through
关系的正确命名约定 - 对于has_and_belongs_to_many
关系是正确的。在has_many :through
中,“join”模型不仅仅用于加入 - 它也是自己的模型,它有自己的数据,也会发生以将其他两个模型连接在一起。< / p>
如果您的OrderProduct
模型没有任何自己的数据,逻辑或约束,那么您可以使用has_and_belongs_to_many
关系,完全删除模型,然后您的连接表是命名正确。否则,它根据常规模型命名约定命名,即order_products
。