0

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` 

私はあなたのいくつかはオープン、このナットを割ることを願って事前に

おかげ - ピーター・パイパー

答えて

2

私は同じ問題を抱えていた、私は書きます同様の例

1.Firstモデル:

class Label < ActiveRecord::Base 
has_and_belongs_to_many :spaces 
end 

2.Seco NDモデル:

class Space < ActiveRecord::Base 
has_and_belongs_to_many :labels 
end 

3.移行:

rails g migration createSpacesLabels 
  1. 編集移行:

    class CreateSpacesLabels < ActiveRecord::Migration 
    def up 
        create_table :spaces_labels, :id => false do |t| 
        t.references :space 
        t.references :label 
    end 
    add_index :spaces_labels, [:label_id, :space_id] 
    add_index :spaces_labels, [:space_id, :label_id] 
    end 
    
    def down 
    drop_table :spaces_labels 
    end 
    end 
    
  2. 問題:

    私はレールが間違っを検索することがわかりましたタble、スペースラベルの代わりにlabelsspacesを探します、私はそれがモデルの名前のためだと思います。私がモデルに追加することによってそれを解決:

    has_and_belongs_to_many :labels,:join_table=>'spaces_labels' 
    
    has_and_belongs_to_many :spaces,:join_table=>'spaces_labels' 
    

さて、あなたはspace.labels @またはlabel.spaces @のようなクエリを実行するために、できるはずです。 私はそれが助けてくれることを願っています。

関連する問題