ActiveRecordを使用した同じモデルへの多対多の関連付け?
-
06-07-2019 - |
質問
このチュートリアルをフォローしていますhas_many:throughリレーションシップで見事に機能している。 category_productが正常に動作しているなど、通常のものがあります。
ただし、この状況を概念化することはできません(または動作させません)。関連するカテゴリを持つカテゴリがあります。すべてのカテゴリはN個のカテゴリを持つことができます...まず最初に、これは実際には多対多の状況ですか(そうだとかなり肯定的です)?第二に、これはどのように見えるでしょうか?私の移行は次のようになります。
create_table :categories do |t|
t.string :name
t.timestamps
end
create_table :related_categories, :id => false do |t|
t.integer :category_a_id
t.integer :category_b_id
end
そして私のモデルの内臓は
has_many :related_categories, :foreign_key=>"category_a_id"
has_many :categories, :through => :related_categories, :source=>:category_a
これは明らかに正しくありませんが、そこに到達しています(つまり、完全に壊れています)。どうすればいいですか?
編集:私はこれを忘れていましたが、ここSOでのみ(答えではないことを意味します):
class RelatedCategory < ActiveRecord::Base
belongs_to :category_a, :class_name=>"Category"
belongs_to :category_b, :class_name=>"Category"
end
解決
:source =&gt;を試してください。 :category_b
をhas_many宣言に追加します。
既に category_a_id
を関連カテゴリテーブルへの外部キーとして使用しています。これは基本的に、ActiveRecordに関連するすべてのrelated_categoriesレコードを取得するときに、 related_categories
テーブルの category_a_id
フィールドを現在のCategoryオブジェクトIDに一致させるようActiveRecordに指示します。この has_many:through
宣言のsourceパラメーターは、カテゴリコレクションを埋めるときに関連オブジェクトを見つける(または、そのことについて書く)ために考慮すべきフィールドを指定します。
他のヒント
答えはここにありますが、見た目は美しくありません。
has_many :related_categories, :foreign_key=>"category_a_id"
has_many :related_categories2, :class_name=>"RelatedCategory", :foreign_key=>"category_b_id"
has_many :categories, :through => :related_categories, :source=>:category_b
has_many :categories_backwards, :through => :related_categories2, :source=>:category_a
has_many :category_products
その後、カテゴリとcategories_backwardsなどを組み合わせた、間抜けなゲッターを実行する必要があります。
編集[2分後]:わあ、ゲッターではほぼ完璧に見えます!もちろん、問題は、ゲッターから取得したものではなく、カテゴリにプッシュする必要があることです。