2011-02-06 106 views
19

好的,所以这里是交易。我有两个表和一个连接表,因为它是一个多对多的关系。我有一个订单,一个订单可以有很多产品。很显然,这是另一种方式,因为产品可以有很多订单。我有以下类: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表,大概是出于同样的原因。

回答

27

orders_products是不是一个has_many :through关系的正确的命名约定 - 这正确的has_and_belongs_to_many关系。在has_many :through中,“加入”模型不仅仅用于加入 - 它也是它自己的模型,它有自己的数据,也发生加入其他两个模型在一起。

如果您的OrderProduct模型没有它自己的任何数据,逻辑或约束,那么您可以使用has_and_belongs_to_many关系代替,完全删除模型,然后将连接表命名为正确。否则,它会根据常规型号命名约定命名,即order_products

+0

查看[本主题指南](http://guides.rubyonrails.org/association_basics.html#the-has_many-through-association)查看正确的`has_many:through`关联示例。 – 2011-02-06 06:23:40