检索用户关注的所有用户的post – 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提供了礼物,在我的提要中我只想看到一个提及此而不是两个提及同一个礼物。

我会在我的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 

在Rails 4和关联 (不是gem)上测试了这一点。 这将给出created_at命令的不同礼物记录: –

@gifts = User.find(id).following_users.joins(:received_gifts,:given_gifts).select(’DISTINCT gifts。*’)

另外根据文档 ,我认为你应该使用followers_scoped而不是followers来获得Arel范围而不是元素数组