2009-05-27 14 views
0

以下に定義されている関連付けを考えれば、私は がカテゴリに属しているすべての分類にアクセスできない理由を明らかにすることができます。 私はそれがそこにある多型の関係 があるという事実とは何かを持って推測しているが、私は、私はちょうど 関連文を使用してやりたいための適切な方法があるかどうかを知りたいのですが、あるいは私が持っている場合"私自身のロール"にして、 で2つの段階のクラシファイドを取得します。おそらくhas_many:through二次多型

コードだけ見て理解しやすく:ほとんどの部分について

class CategorySection < ActiveRecord::Base 
    has_many :categories 
    has_many :categorizations, :through => :categories 
    has_many :classifieds, :through => :categories 
end 

class Category < ActiveRecord::Base 
    belongs_to :section, :class_name => 'CategorySection', 
         :foreign_key => 'category_section_id', 
         :counter_cache => true 
    has_many :categorizations 
    has_many :classifieds, :through => :categorizations, 
         :source => :categorizable, 
         :source_type => 'Classified' 
end 

class Categorization < ActiveRecord::Base 
    belongs_to :category, :counter_cache => true 
    belongs_to :categorizable, :polymorphic => true 
end 

class Classified < ActiveRecord::Base 
    has_one :categorization, :as => :categorizable, :dependent => :destroy 
    has_one :category, :through => :categorization 
end 

を、これはすべて私が把握することはできません1つの関連を除いて正常に動作しています。 は、どのように私はすぐにそれに属するすべてのクラシファイド広告を見つけることができ、CategorySectionを考えると?例えば

カテゴリーを考えると、私はすべてのそれの分類を取得することができます:

>> @category.categorizations 
>> [<Categorization...>,<Categorization...>] 

カテゴリーを考えると、私はそれにすべての分類を取得することができます:

>> @category.classifieds 
>> [<Classified...>,<Classified...>] 

を考えます

>> @section.categories 
>> [<Category...>,<Category...>] 
0:セクション、私はそのカテゴリのすべてを取得することができます私が通過してその分類の全てを取得することはできません、第与えられ、カテゴリ

>> @section.categorizations 
>> [<Categorization...>,<Categorization...>] 

:しかし

は、セクションを考えると、私が通過してその分類の全てを取得することができますカテゴリ

>> @section.classifieds 
ActiveRecord::HasManyThroughSourceAssociationMacroError: 
Invalid source reflection macro :has_many :through for 
has_many :classifieds, :through => :categories. Use :source 
to specify the source reflection. 

私は」エラーメッセージのアドバイスを取ってソースを指定していますが、それでも動作させることはできません。私は、私が考えることができるが役に立たないその協会のオプションのすべての組み合わせを試した。

何かアドバイスや提案は、最も高く評価されるだろう。前もって感謝します。敬具

、 ケニー

答えて

0

は、あなたが ":through" なしにhas_manyを定義しようとしたことがありますか?

class CategorySection < ActiveRecord::Base 
    has_many :categories 
    has_many :categorizations, :through => :categories 
    has_many :classifieds 
end 

このrailscastをご覧になりたいかもしれません。一度団体に比べて:私はRailsが使用することはできません覚えていたよう

+0

悲しいことに、ClassifiedのCategorySectionに戻るforeign_keyがないので、うまくいきません。あなたは他の方法をとることができます、ClassifiedはどのCategoryにあるのか分かり、CategorySectionを取得しますが、私が探している方法ではありません。 – kennyc

+0

クラシファイドのカテゴリーセクションに外部キーを戻すことができない理由はありますか? – eggdrop

+0

いいえ、私はそれを行うことはできません厳しい要件は、それは、私はセクションの外部キーを手動でbefore_saveフィルタで設定する必要があることを意味します。それはこの問題の解決策かもしれませんし、そうであればいいですが、もともと関連宣言を使ってこれを解決する方法があれば、私はもともと興味がありました。手動で外部キーを設定することは、通常は "Rails Way"ではないので、私はより正確なソリューションと標準化されたソリューションに興味がありました。 FWIW .... – kennyc

0

。 (あなたのように)別々のモデルに貫通:確かにあなたは、このような何かすることはできません。

has_many :books 
has_many :authors, :through => :books 
has_many :phones, :through => :authors 

をしかし、それは二重の操作を行うことができた場合、私はわかりません。まず、多態性なしでそれをしようとすることができます - それが動作する場合、私の提案は間違っています。

私はRailsは、すべての関連付けチェーンのための単一のSQLクエリをgenereteしようとしていることを考える - そしてそれは非常に複雑です。

あなた自身で作成することができます:finder_sql for that association。