Отправка значений объектов как оператора IN в Rails - PullRequest
0 голосов
/ 10 октября 2010

Я работаю над действием Newsfeed.У меня активная дружба, и я хотел бы найти посты только тех друзей, чтобы создать ленту новостей.

Это код, который у меня сейчас есть:

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

Я не знаю, как отправить значения @ active_friendships.user_id в IN во второй строке.На данный момент код работает только потому, что он жестко закодировал user_id моих активных друзей (5,8,16).

(если я отлаживаю @active_friendships), я получаю 3 объекта с их идентификаторамино я все еще не знаю, как отправить их в IN во второй строке как идентификаторы для поиска.

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

Большое спасибо заранее

Ответы [ 4 ]

1 голос
/ 11 октября 2010

Вы можете попробовать это:

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

Но лучший способ реализовать это - добавить ассоциацию

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

Теперь вы можете сделать следующее:

current_user.active_friend_posts.order("created_at DESC") 
0 голосов
/ 10 октября 2010

У меня была похожая проблема. Вот как я это реализовал:

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

Это создает массив всех идентификаторов пользователей из @active_friendships и затем объединяет их в строку с запятой в качестве разделителя. Затем я просто передал это параметру: condition.

Это не так элегантно, как мне нравится, но работает.

Надеюсь, это поможет.

0 голосов
/ 11 октября 2010

В Rails есть специальный метод для получения массива связанных идентификаторов.Вы должны быть в состоянии сделать это в одной строке примерно так:

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

Всякий раз, когда вы имеете дело с отношениями has_many и has_many: through, у вас есть доступ к методу association_ids, который не возвращаетполные объекты.Проверьте полный API здесь:

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

0 голосов
/ 10 октября 2010

Я новичок в этом, но не могли бы вы собрать все Friendship.user_id в массив и затем передать это в предложении where?

@friends_userids = current_user.active_friendships.collect { |x| x.user_id }
@posts = Post.where({ :user_id => @friends_userids }).order("created_at DESC")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...