2009-07-01 18 views
6

Questa è una continuazione di questa domanda: Original Question (SO)Rails - a due vie modello di "amicizia" (segue)

La risposta a questa domanda ha comportato la seguente serie di modelli:

class User < ActiveRecord::Base 
    has_many :friendships 
    has_many :friends, :through => :friendships #... 
end 

class Friendship < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :friend, :class_name => 'User', :foreign_key => 'friend_id' 
end 

<% for friendship in @user.friendships %> 
    <%= friendship.status %> 
    <%= friendship.friend.firstname %> 
<% end %> 

Funziona bene se dico, ho un utente e voglio ottenere tutte le "amicizie" per le quali il suo id è: user_id FK sul modello Friendship. Ma, quando corro qualcosa come

@user.friendships.friends 

vorrei per tornare tutti i record utente per il quale l'utente è sia il: utente o il: amico in amicizia - così, in altre parole, restituire tutte le amicizie in quale utente è coinvolto

Speriamo che quanto sopra abbia senso. Sono ancora abbastanza nuovo per le rotaie e spero che ci sia un modo per farlo elegantemente senza fare solo una tabella di collegamento standard o fornire SQL personalizzato.

Grazie!

Tom

+0

c'è una domanda simile, con una buona risposta trovate qui: [tabella di collegamento con le chiavi esterne] (http://stackoverflow.com/questions/623909/rails-model-with-foreignkey-and-link-table/623956#624261) – Tilendor

risposta

3

Non si può semplicemente utilizzare @ user.friendships qui perché solo vi darà quelle amicizie dove @ friendship.user_id == @ user.id. L'unica cosa che mi viene in mente in questo momento è solo per fare

Friendship.find_by_user_id(@user.id).concat Friendship.find_by_friend_id(@user.id) 
1

Dal link Railscast:

# models/user.rb 
has_many :friendships 
has_many :friends, :through => :friendships 
has_many :inverse_friendships, :class_name => "Friendship", :foreign_key => "friend_id" 
has_many :inverse_friends, :through => :inverse_friendships, :source => :user 
2

la mia soluzione è aa portata:

# model 
class Message < ActiveRecord::Base 
    belongs_to :sender, :class_name => "User" 
    belongs_to :recipient, :class_name => "User" 

    scope :of_user, lambda { |user_id| where("sender_id = ? or recipient_id = ?", 
     user_id, user_id) } 
end 


# in controller 
@messages = Message.of_user(current_user) 
+0

Questo ha funzionato per me. Semplice ed efficace. Grazie! – Myxtic

Problemi correlati