2011-02-06 3 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. Я действительно стуча головой о стену на этом.

EDIT: Я вижу, что даже если он сохранил мой заказ, и я выбрал несколько флажков, он не сохранил никаких значений в таблице orders_products, предположительно по той же причине, что и ошибка.

ответ

27

orders_products не является правильным именования для has_many :through отношений - это является правильным для has_and_belongs_to_many отношений. В модели has_many :through модель «join» предназначена не только для объединения - это также ее собственная модель, которая имеет свои собственные данные, что также происходит, чтобы объединить две другие модели вместе.

Если в вашей модели OrderProduct нет собственных данных, логических схем или ограничений, тогда вы можете использовать отношения has_and_belongs_to_many, удалите модель целиком, а затем ваша таблица соединений будет названа правильно. В противном случае он называется в соответствии с обычными соглашениями об именах моделей, а именно order_products.

+0

См. [Руководство по этой теме] (http://guides.rubyonrails.org/association_basics.html#the-has_many-through-association) для примера правильной ассоциации 'has_many: through'. –

+3

Ах, видите, я думал, что habtm устарел. – MattC

+0

Однако, похоже, я исправил свою проблему, поэтому вы получаете звезду. Кроме того, 5 баллов за принятый ответ: D – MattC