2009-07-01 2 views
6

Ceci est la suite de cette question: Original Question (SO)Rails - Deux voies modèle "amitié" (suite)

La réponse à cette question implique l'ensemble des modèles suivants:

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 %> 

Cela fonctionne bien si je dis, j'ai un utilisateur et je veux obtenir toutes les "amitiés" pour lesquelles son identifiant est le: user_id FK sur le modèle de l'amitié. Mais, quand je lance quelque chose comme

@user.friendships.friends 

Je voudrais à renvoyer tous les enregistrements d'utilisateurs pour lesquels l'utilisateur est soit l': utilisateur ou le: ami dans l'amitié -, en d'autres termes, retourner toutes les amitiés auquel cet utilisateur est impliqué.

Espérons que ce qui précède a du sens. Je suis encore tout à fait nouveau sur les rails et j'espère qu'il y a un moyen de le faire avec élégance sans faire une simple table de liaison standard ou fournir du SQL personnalisé.

Merci!

Tom

+0

Il existe une question similaire avec une bonne réponse trouvée ici: [tableau de liens avec des clés étrangères] (http://stackoverflow.com/questions/623909/rails-model-with-foreignkey-and-link-table/623956#624261) – Tilendor

Répondre

3

Vous ne pouvez pas simplement utiliser @ user.friendships ici parce qu'il ne vous donnera ces amitiés où @ friendship.user_id == @ user.id. La seule chose que je peux penser est en ce moment juste pour faire

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

à partir du lien 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

ma solution est aa portée:

# 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

Ça a marché pour moi. Simple et efficace. Merci! – Myxtic