检索用户关注的所有用户的帖子 - rails - ActiveRecord

时间:2014-12-21 04:15:35

标签: ruby-on-rails ruby rails-activerecord

我有一个简单的rails应用程序,用户可以互相提供虚拟礼物。每件礼物属于两个用户,即给予者和接收者。

在我的 User.rb

has_many :given_gifts, class_name: 'Gift', foreign_key: 'giver_id'
  has_many :received_gifts, class_name: 'Gift', foreign_key: 'receiver_id'

  acts_as_followable
  acts_as_follower

在我的 Gift.rb

belongs_to :giver, class_name: 'User'
belongs_to :receiver, class_name: 'User'

我正在使用acts_as_follower gem来允许用户关注其他用户,并查看他们关注的用户提供和接收的礼物列表。

在我的控制器中:

id = current_user.id
@given_gifts = User.find(id).following_users.includes(:given_gifts).collect{|u| u.given_gifts}.flatten

@received_gifts = User.find(id).following_users.includes(:received_gifts).collect{|u| u.received_gifts}.flatten

@gifts = @given_gifts.zip(@received_gifts).flatten.compact

我确定我做错了。这给了我一份礼物清单,有一些重复,但它们都是乱序的。 如何有效地获取任何给定用户所关注的用户给出和接收的所有礼物的列表,这样他们就没有重复,它们都是有序的,所以我可以对结果进行分页?

如果作为用户,我关注用户X和用户Y,并且用户X向用户Y赠送礼物,在我的Feed中我只想看到一个提及此而不是两个提及同一个礼物。

2 个答案:

答案 0 :(得分:1)

我会在我的Gift模型中创建一个自定义方法,试试这个:

<强> gift.rb

class Gift < ActiveResource::Base

...

def self.all_gifts(user_id)
  follower_ids = User.find(user_id).following_users.pluck(:id)
  Gift.where('giver_id in (?) OR receiver_id in (?)', follower_ids, follower_ids).uniq
end

...

这将最终生成并运行如下所示的SQL调用:

SELECT DISTINCT "gifts".* FROM "gifts" WHERE (giver_id in (1,2,3) OR receiver_id in (1,2,3))

鉴于ID为1,2和3的用户关注该用户。您应该能够在控制器中对这些结果进行分页:

id = current_user.id
Gift.all_gifts(id).paginate # any paginate attributes

答案 1 :(得分:0)

在Rails 4和关联(不是gem)上测试过。这将提供由created_at命令的不同礼物记录: -

@gifts = User.find(id).following_users.joins(:received_gifts,:given_gifts).select(&#39; DISTINCT gifts。*&#39;)

同样根据documentation,我认为您应该使用 followers_scoped 而不是关注者来获取Arel范围而不是元素数组