質問

このチュートリアルをフォローしています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分後]:わあ、ゲッターではほぼ完璧に見えます!もちろん、問題は、ゲッターから取得したものではなく、カテゴリにプッシュする必要があることです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top