Rails 3 has_many: проблема с именами - PullRequest
19 голосов
/ 06 февраля 2011

Хорошо, вот сделка.У меня есть две таблицы и таблица соединений, так как это отношение многих ко многим.У меня есть заказ, и у заказа может быть много продуктов.Очевидно, что все идет иначе, так как товары могут быть на много заказов.У меня есть следующие классы:

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

1 Ответ

27 голосов
/ 06 февраля 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...