私はいくつかManager
とSoccerTeam
モデルを手に入れました。マネージャーは多くのサッカーチームを「所有」しています。また、マネージャーはサッカーチームにコメントしたり、他のマネージャーにもコメントしたりできます。
manager.rb
# Soccer teams the manager owns
has_many :soccer_teams, :dependent => :restrict
# Comments the manager has made on soccer teams or other managers
has_many :reviews, :class_name => "Comment", :foreign_key => :author_id, :dependent => :destroy
# Comments the manager has received by other managers
has_many :comments, :as => :commentable, :dependent => :destroy
# Soccer teams that have received a comment by the manager
has_many :observed_teams, :through => :comments, :source => :commentable, :source_type => "SoccerTeam"
Soccer_team.rb
# The manager that owns the team
belongs_to :manager
# Comments received by managers
has_many :comments, :as => :commentable, :dependent => :destroy
# Managers that have reviewed the team
has_many :observers, :through => :comments, :source => :author, :class_name => "Manager"
comment.rb
belongs_to :commentable, :polymorphic => true
belongs_to :author, :class_name => Manager
さて、もし私がサッカーチームにコメントしているマネージャーがいるなら、私は見つけることを期待しています:
- 内外の
Comment
オブジェクトmanager.reviews
soccer_team.comments
- の
SoccerTeam
オブジェクトmanager.observed_teams
- の
Manager
オブジェクトsoccer_team.observers
1番目と3番目のポイントではすべてがうまく機能しますが、呼び出すmanager.observed_teams
と常に空の配列が取得されます。マネージャーがコメントしたサッカーチームのリストを実際に入手するには、次のものを使用する必要があります。
manager.reviews.collect{ |review| Kernel.const_get(review.commentable_type).find(review.commentable_id) if review.commentable_type == "SoccerTeam" }
これは醜いです。シンプルに機能することを期待しmanager.observed_teams
ています…なぜ機能しないのですか?
編集
なぜそれが機能しないのかを理解するためにさらに一歩進んだ。実際、生成されたSQLは次のとおりです。
SELECT "soccer_teams".* FROM "soccer_teams" INNER JOIN "comments" ON "soccer_teams".id = "soccer_teams".commentable_id AND "comments".commentable_type = 'SoccerTeam' WHERE (("comments".commentable_id = 1) AND ("comments".commentable_type = 'Manager'))
私はそれをしたいのですが:
SELECT "soccer_teams".* FROM "soccer_teams" INNER JOIN "comments" ON "soccer_teams".id = "comments".commentable_id AND "comments".commentable_type = 'SoccerTeam' WHERE ("comments".author_id = 1)
したがって、質問は単純です。そのクエリを取得する方法は?:foreign_key
(予想どおり、 ansを使用したヒューリスティックな試みで:as
は、問題は解決していません!)。