has_and_belongs_to_many関連付けを使用しようとすると、かなりイライラする問題が発生しました。Rails 3.1カスタムforeign_keyとHABTMの関連付けが間違った結合ステートメントを生成する
シナリオは次のとおりです。
多くのニュースアイテムが関連付けられている商品があり、その逆もあります。ニュースアイテムはさまざまな言語に翻訳することができるので、同じコンテンツのニュースを追跡するために(別の言語に翻訳して)、ニュースにnews_idを追加しました。
私の問題は、製品とユニークなニュース(newsitem.news_id)との関連付けであり、単一のニュースアイテム(newsitem.id)ではないということです。
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が生成されます。この設定を使用する:
私のモデルは次のように
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
マイ移行
ある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"
私は、製品に関連付けられているすべてのNewsItemを求める際にトラブルが始まる: 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 and:foreign_key =>:newsitemのnews_idは "ON newsitems
"を生成します。 id
が「間違っていると次のようになります。
ON `newsitems`.`news_id` = `newsitems_products`.`news_id`
私はあなたのいくつかはオープン、このナットを割ることを願って事前に
おかげ - ピーター・パイパー