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
, предположительно по той же причине, что и ошибка.
Ответы
Ответ 1
orders_products
не является правильным соглашением об именах для отношения has_many :through
- это правильно для отношения has_and_belongs_to_many
. В has_many :through
модель "join" предназначена не только для соединения - это также ее собственная модель, которая имеет свои собственные данные, что также объединяет две другие модели вместе.
Если ваша модель OrderProduct
не имеет никаких собственных данных, логики или ограничений, тогда вы можете использовать связь has_and_belongs_to_many
, полностью удалите модель, а затем ваша таблица соединений будет названа правильно. В противном случае он называется в соответствии с обычными соглашениями об именах моделей, а именно order_products
.