ActiveRecord Rails有效查询

时间:2014-12-22 02:41:12

标签: ruby-on-rails ruby

Take a look at this question

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

我正在尝试检索当前用户所关注的所有用户收到的礼物列表。 有更好的方法吗?结果全部乱序,并显示一些重复。我正在尝试做一个有效的查询,我可以分页。

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

1 个答案:

答案 0 :(得分:1)

尝试这样的事情:

following_user_ids = current_user.following_users.pluck(:id)
Gift.where("(giver_id IN ?) OR (receiver_id IN ?)",
           following_user_ids, following_user_ids).order(:created_at)

基本上,这会获取following_users id的列表,然后使用OR查询来获取列表中任何用户给出或接收的礼物。

此查询的性能取决于底层数据库和您正在处理的记录数。但对于以下用户的小数量(< = 100),它通常会表现良好。随着following_user_ids数量的增加,性能将下降。