7

私はいくつかManagerSoccerTeamモデルを手に入れました。マネージャーは多くのサッカーチームを「所有」しています。また、マネージャーはサッカーチームにコメントしたり、他のマネージャーにもコメントしたりできます。

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.reviewssoccer_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は、問題は解決していません!)。

4

1 に答える 1

13

に間違った関連付けを使用しただけだと思いますobserved_teams。それ以外の

has_many :observed_teams, :through => :comments, 
  :source => :commentable, :source_type => "SoccerTeam"

これを試して:

has_many :observed_teams, :through => :reviews,
 :source => :commentable, :source_type => "SoccerTeam"

でも、

has_many :reviews, :class_name => :comment, 
  :foreign_key => :author_id, :dependent => :destroy

:commentする必要があります'Comment'

とで

has_many :comments, :as => commentable, :dependent => :destroy

commmentableする必要があります:commmentable

于 2011-02-21T21:31:03.177 に答える