Я столкнулся с довольно неприятной проблемой при попытке использовать ассоциации has_and_belongs_to_many.
Сценарий выглядит следующим образом.
У меня есть продукт, с которым связано много новостей, и наоборот.Новостные статьи могут быть переведены на разные языки, поэтому для отслеживания новостей с одинаковым содержанием (но переведенных на другой язык) - я добавил новостной идентификатор в новость.
Моя проблема в том, что ассоциациямежду продуктом и уникальной новостью (newsitem.news_id), а не в одной новости (newsitem.id).
Мои модели:
class Product < ActiveRecord::Base
has_and_belongs_to_many :newsitems , :association_foreign_key => :news_id
end
class Newsitem < ActiveRecord::Base
has_and_belongs_to_many :products, :foreign_key => :news_id
end
Мои миграции следующие:
def change
create_table :products do |t|
t.string :name
t.timestamps
end
end
def change
create_table :newsitems do |t|
t.string :content
t.integer :news_id
t.integer :language_id
t.timestamps
end
end
def change
create_table :newsitems_products, :id => false do |t|
t.integer :news_id
t.integer :product_id
end
end
Используя эту настройку, я получаю следующий правильный sql, сгенерированный при вызове:
news = Newsitem.first
news.products.to_sql
SQL:
"SELECT `products`.* FROM `products`
INNER JOIN `newsitems_products`
ON `products`.`id` = newsitems_products`.`product_id`
WHERE `newsitems_products`.`news_id` = 1"
Проблемы начинаются, когда я прошу всеНовостные элементы, связанные с продуктом: prod = Products.first prod.newsitems.to_sql SQL:
"SELECT `newsitems`.* FROM `newsitems`
INNER JOIN `newsitems_products`
ON `newsitems`.`id` = `newsitems_products`.`news_id`
WHERE `newsitems_products`.`product_id` = 1"
Событие, хотя я объявил: association_foreign_key =>: news_id для продукта и: foreign_key =>: news_id на newsitem для генерации«ON newsitems
. id
» неверно и должно быть:
ON `newsitems`.`news_id` = `newsitems_products`.`news_id`
Я надеюсь, что некоторые из вас могут открыть эту гайку.
Заранее спасибо - Питер Пайпер