2

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

これは明らかに正しいことではありませんが、それは達成されつつあります (つまり、100% 壊れています)。これどうやってするの?

編集:私はこれを忘れましたが、ここでのみ SO (答えではないことを意味します):

class RelatedCategory < ActiveRecord::Base
  belongs_to :category_a, :class_name=>"Category"
  belongs_to :category_b, :class_name=>"Category"
end
4

2 に答える 2

2

:source => :category_bhas_many 宣言で試してください。

category_a_id関連するカテゴリ テーブルへの外部キーとして既に使用しています。category_a_idこれは基本的に、関連するすべての related_categories レコードを取得するときに、テーブルのフィールドをrelated_categories現在の Category オブジェクト IDと一致させるように ActiveRecord に指示します。このhas_many :through宣言のソース パラメータは、カテゴリ コレクションに入力するときに、関連するオブジェクトを検索 (さらに言えば、書き込み) するためにどのフィールドを考慮する必要があるかを指定します。

于 2009-06-18T21:36:28.237 に答える
0

これが答えですが、きれいではありません。

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

于 2009-06-18T23:18:50.120 に答える