2011-02-06 54 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