2011-12-14 9 views
7

Para tomar un ejemplo con el que todo el mundo está familiarizado, piense en StackOverflow. Un usuario has_many :questions, has_many :answers y sus preguntas y respuestas pueden ser comentadas. (El comentario es polimórfico).has_many a través de varios modelos con una fuente única

quiero conseguir todas las respuestas dirigidas a un usuario en particular a través de un comentario en cualquiera de las preguntas o respuestas de este usuario:

class User < ActiveRecord::Base 
    has_many :questions 
    has_many :answers 
    has_many :comments 
    has_many :responses, through: [:questions, :answers], source: :comments 
end 

class Question < ActiveRecord::Base 
    belongs_to :user 
    has_many :answers 
    has_many :comments, as: :commentable 
end 

class Answer < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :question 
    has_many :comments, as: :commentable 
end 

class Comment < ActiveRecord::Base 
    belongs_to :commentable, polymorphic: true 
end 

Por supuesto, has_many :responses, through: [:questions, :answers], source: :comments no funciona.

¿Hay alguna manera de que Rails lo haga?

Gracias.

+0

Creo que esto ha sido respondida aquí: http://stackoverflow.com/questions/3487730/reverse-polymorphic-associations – DGM

+0

@DGM Gracias pero por desgracia no. Por cierto, la respuesta aceptada no es realmente lo correcto para hacer IMO. – Damien

+0

¿qué tal escribir condiciones sql en asociación? – blade

Respuesta

1
has_many :responses, :class_name => "Comment", :finder_sql => 
      'SELECT DISTINCT comments.* ' + 
      'FROM comments c, questions q, answers a ' + 
      'WHERE (c.commentable_id = a.id and c.commentable_type='Answer' and a.user_id = #{id}) or (c.commentable_id = q.id and c.commentable_type='Question' and q.user_id = #{id})' 
Cuestiones relacionadas