Rails - 将三个表连接到一个时计算查询

时间:2011-05-27 03:45:22

标签: ruby-on-rails activerecord join count

我有一个相当简单的查询,我似乎无法做对......

我的模特:

  • 用户 - 有很多友谊(与其他用户一起)
  • 用户 - 有很多提交
  • 用户 - 有很多评论
  • 用户 - 有很多选票

我需要一个代表

的计数
  

所有current_user的朋友,其提交,评论或投票创建日期为> current_user.last_refresh_date

现在,我正在通过迭代友谊并添加所有提交,评论和投票来构建数组。然后我重新迭代这个组合数组,同时比较日期以确定计数是否应该递增。不是最理想的解决方案。

修改

@TobiasCohen

高效的解决方案。谢谢!

跟进:

我希望在本查询中再添加一个计数。我需要计算所有新评论&对current_user.submissions的投票不属于原始计数(即不是朋友)。

Psuedo-code:

  

current_user.submissions.join(:comments,:votes,:friends).where('last_activity>?AND friend_id!=?',current_user.last_refresh_date,current_user.id).count

我无法使查询正确(通过活动记录对复杂查询是新的)。

我打算将它作为一个单独的查询,然后将其添加到原始计数中。它可以被吸收到一个查询中而不是两个吗?

1 个答案:

答案 0 :(得分:2)

我认为您可以通过在用户上添加缓存列来获得最佳效果,让我们称之为:last_activity_at,然后使用提交,评论和投票上的after_create回调更新此内容。

class Submission < ActiveRecord::Base
  belongs_to :user

  after_create :update_user_last_activity_at

  private
    def update_user_last_activity_at
      user.update_attribute :last_activity_at, Time.now
    end
end

然后您可以使用以下方式获取用户:

current_user.friends.where('last_activity_at > ?', current_user.last_refresh_date)