2010-10-10 4 views
0

Je travaille sur une action Newsfeed. J'ai des amitiés actives et je voudrais trouver les poteaux seulement de ces amitiés pour créer le fil d'actualité.Envoyer des valeurs d'objets sous forme d'instruction IN dans Rails

C'est le code que j'ai actuellement:

@active_friendships = current_user.active_friendships 
@posts = Post.where({ :user_id => [5,8,16] }).order("created_at DESC") 

Je ne sais pas comment envoyer les valeurs @ active_friendships.user_id de l'IN dans la deuxième ligne. Au moment où le code est seulement travaillé parce qu'il a codé en dur le user_id de mes amis actifs (5,8,16).

(Si je fais un débogage @active_friendships) je reçois les 3 objets avec leurs identifiants, mais je ne sais toujours pas comment les envoyer à l'IN dans la deuxième ligne comme les ID à rechercher.

-- 
- !ruby/object:Friendship 
    attributes: 
    created_at: 2010-10-06 22:27:54.620007 
    updated_at: 2010-10-07 00:19:10.329799 
    id: 182 
    user_id: 8 
    status: 1 
    friend_id: 5 
    attributes_cache: {} 

    changed_attributes: {} 

    destroyed: false 
    marked_for_destruction: false 
    new_record: false 
    previously_changed: {} 

    readonly: false 
- !ruby/object:Friendship 
    attributes: 
    created_at: 2010-10-07 19:13:10.617959 
    updated_at: 2010-10-07 19:13:17.097514 
    id: 192 
    user_id: 16 
    status: 1 
    friend_id: 5 
    attributes_cache: {} 

    changed_attributes: {} 

    destroyed: false 
    marked_for_destruction: false 
    new_record: false 
    previously_changed: {} 

    readonly: false 
- !ruby/object:Friendship 
    attributes: 
    created_at: 2010-10-10 04:12:48.931120 
    updated_at: 2010-10-10 04:12:56.960752 
    id: 214 
    user_id: 8 
    status: 1 
    friend_id: 5 
    attributes_cache: {} 

    changed_attributes: {} 

    destroyed: false 
    marked_for_destruction: false 
    new_record: false 
    previously_changed: {} 

    readonly: false 

Un grand merci à l'avance

Répondre

0

Je suis novice en la matière, mais pourriez-vous rassembler tous de l'Friendship.user_id dans un tableau et passent ensuite que dans la clause where?

@friends_userids = current_user.active_friendships.collect { |x| x.user_id } 
@posts = Post.where({ :user_id => @friends_userids }).order("created_at DESC") 
+0

Oui, c'est tout. Merci beaucoup pour l'aide! – Martin

0

J'ai eu un problème similaire. Voilà comment j'implémenté:

ids = @active_friendships.map { |x| x.user_id } 
ids = ids.join(",") 
@posts = Post.all(:conditions => ["posts.user_id in (#{ids})"]).order("created_at DESC") 

Cela crée un tableau de tous les ID utilisateur de @active_friendships et les rejoint ensuite dans une chaîne par une virgule comme séparateur. Alors j'ai simplement passé ceci au paramètre: conditions.

Ce n'est pas aussi élégant que j'aime mais ça marche.

Espérons que cela aide.

+0

Checkout l'autre réponse, il a une meilleure approche. Merci! – Martin

0

Rails possède une méthode spéciale pour obtenir un tableau d'identifiants associés. Vous devriez être en mesure de le faire dans une ligne quelque chose comme ceci:

@posts = Post.where(:user_id => current_user.active_friendship_ids).order("created_at DESC") 

Chaque fois que vous avez affaire à has_many et has_many: grâce à des relations, vous avez accès à la méthode association_ids, qui ne reviendra pas les objets pleins . Vérifiez la pleine api ici:

http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html

1

Vous pouvez essayer ceci:

@posts = Post.where(:user_id => @active_friendships.map(&:friend_id) 
        ).order("created_at DESC" 

Mais une meilleure façon de mettre en œuvre est d'ajouter une association

class User 
    has_many :active_friendships, :class_name => "Friendship", :conditions = {...} 
    has_many :active_friend_posts, :through => :active_friendships, 
      :source => :friend_posts 
end 

class Friendship 
    belongs_to :user 
    belongs_to :friend, :class_name => "User" 
    has_many :friend_posts, :class_name => "Post", 
       :primary_key => :freind_id, :foreign_key => :post_id 
end 



class Post 
    belongs_to :user 
end 

Maintenant, vous pouvez faire les éléments suivants:

current_user.active_friend_posts.order("created_at DESC") 
Questions connexes