【问题标题】:Rails - count query while joining three tables to oneRails - 在将三个表连接到一个时计数查询
【发布时间】:2011-05-27 03:45:21
【问题描述】:

我有一个相当简单的查询,但我似乎无法正确......

我的模特:

  • 用户 - 有很多友谊(与其他用户)
  • 用户 - 提交了很多内容
  • 用户 - 有很多 cmets
  • 用户 - 有很多投票

我需要一个代表

的计数

current_user 的所有好友,其提交、cmets 或投票创建日期为 > current_user.last_refresh_date

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

编辑

@TobiasCohen

有效的解决方案。谢谢!

跟进:

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

伪代码:

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

我不能完全正确地得到查询(通过活动记录对复杂查询不熟悉)。

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

【问题讨论】:

    标签: ruby-on-rails activerecord join count


    【解决方案1】:

    我认为通过在用户上添加缓存列可以获得最佳结果,我们称之为: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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-02
      • 2015-09-23
      • 2013-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-20
      • 2023-04-06
      相关资源
      最近更新 更多