Подтвердить что ты не робот

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, предположительно по той же причине, что и ошибка.

4b9b3361

Ответ 1

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

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