在尝试使用 has_and_belongs_to_many 关联时,我遇到了一个相当令人沮丧的问题。
场景如下。
我有一个产品有很多相关的新闻项目,反之亦然。新闻项目可以翻译成不同的语言,所以为了跟踪具有相同内容的新闻(但翻译成不同的语言) - 我在新闻中添加了一个 news_id。
我的问题是关联是在产品和唯一新闻(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 并且在 newsitem 上声明了 :foreign_key => :news_id ,但生成“ON newsitems
. id
”是错误的,应该是:
ON `newsitems`.`news_id` = `newsitems_products`.`news_id`
我希望你们中的一些人能破解这个坚果。
在此先感谢 - 彼得派珀