È possibile avere più relazioni has_many :through
passanti l'una sull'altra in Rails? Ho ricevuto il suggerimento di farlo come soluzione per un'altra domanda che ho postato, ma non sono riuscito a farlo funzionare.Ruby-on-Rails: più has_many: attraverso possibile?
Gli amici sono un'associazione ciclica attraverso una tabella di join. L'obiettivo è quello di creare unper friends_comments
, così posso prendere un User
e fare qualcosa come user.friends_comments
per ottenere tutti i commenti fatti dai suoi amici in una singola query.
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
Questo sembra fantastico e ha senso, ma non funziona per me. Questo è l'errore che sto ricevendo in parte rilevante quando provo ad accedere friends_comments di un utente:
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)))
Quando ho appena entro in user.friends, che funziona, questa è la query esegue:
: SELECT "users".* FROM "users" INNER JOIN "friendships" ON "users".id = "friendships".friend_id WHERE (("friendships".user_id = 1) AND ((status = 2)))
Quindi sembra che si stia completamente dimenticando dell'originale has_many
tramite la relazione di amicizia, e quindi sta tentando in modo inappropriato di utilizzare la classe Utente come tabella di join.
Sto facendo qualcosa di sbagliato, o semplicemente non è possibile?
Sfortunatamente, lo scopo originale alla base di questo approccio era che potevo ottenere tutti i commenti di amici da SQL in una query. Vedi qui: http://stackoverflow.com/questions/2382642/ruby-on-rails-how-to-pull-out-most-recent-entries-from-a-limited-subset-of-a-dat Se scrivo una funzione, ciò produrrà un numero N + 1 di query. –
No non lo farà. Saranno 2 domande. Prima query per ottenere gli amici e la seconda query per ottenere i commenti per ** tutti ** gli amici. Se hai già caricato gli amici sul modello utente, non incorrerai in alcun costo. Ho aggiornato la soluzione con altri due approcci. Guarda. –
@williamjones Non hai problemi N + 1 in tutti e tre gli approcci. È possibile controllare il file di registro per garantire questo. Personalmente mi piace l'approccio 1 in quanto è piuttosto elegante, ad esempio 'user.friends.comments' è meglio di' user.friends_comments' –