¿Es posible tener múltiples relaciones has_many :through
que se crucen en Rails? Recibí la sugerencia de hacerlo como una solución para otra pregunta que publiqué, pero no he podido lograr que funcione.Ruby-on-Rails: Multiple has_many: through possible?
Los amigos son un asociación cíclica a través de una tabla de unión. El objetivo es crear un has_many :through
para friends_comments
, entonces puedo tomar un User
y hacer algo así como user.friends_comments
para obtener todos los comentarios hechos por sus amigos en una sola consulta.
class User
has_many :friendships
has_many :friends,
:through => :friendships,
:conditions => "status = #{Friendship::FULL}"
has_many :comments
has_many :friends_comments, :through => :friends, :source => :comments
end
class Friendship < ActiveRecord::Base
belongs_to :user
belongs_to :friend, :class_name => "User", :foreign_key => "friend_id"
end
Esto se ve muy bien, y tiene sentido, pero no funciona para mí. Este es el error que estoy recibiendo en su parte pertinente cuando intento acceder a la friends_comments de un usuario:
ERROR: column users.user_id does not exist
: SELECT "comments".* FROM "comments" INNER JOIN "users" ON "comments".user_id = "users".id WHERE (("users".user_id = 1) AND ((status = 2)))
Cuando acaba de entrar en user.friends, que funciona, esta es la consulta se ejecuta:
: SELECT "users".* FROM "users" INNER JOIN "friendships" ON "users".id = "friendships".friend_id WHERE (("friendships".user_id = 1) AND ((status = 2)))
Parece que se está olvidando por completo del original has_many
a través de la relación de amistad, y luego está tratando incorrectamente de utilizar la clase de usuario como una tabla de unión.
¿Estoy haciendo algo mal, o simplemente esto no es posible?
Desafortunadamente, el propósito original de este enfoque era poder obtener todos los comentarios de los amigos de SQL en una consulta. Vea aquí: http://stackoverflow.com/questions/2382642/ruby-on-rails-how-to-pull-out-most-recent-entries-from-a-limited-subset-of-a-dat Si escribo una función, eso dará como resultado un número N + 1 de consultas. –
No, no lo hará. Serán 2 consultas. Primera consulta para obtener los amigos y segunda consulta para obtener los comentarios de ** todos ** los amigos. Si ya ha cargado a los amigos en el modelo de usuario, entonces no incurre en ningún costo. He actualizado la solución con dos enfoques más. Echar un vistazo. –
@williamjones No tiene un problema N + 1 en los tres enfoques. Puede verificar su archivo de registro para asegurarse de esto. Personalmente, me gusta el enfoque 1, ya que es bastante elegante, es decir, 'user.friends.comments' es mejor que' user.friends_comments' –