繁体   English   中英

Rails 4 ActiveRecord查询联接和按用户的关联记录数排序

[英]Rails 4 ActiveRecord query join and order by a user's number of association records

我有3个模型,UserActivity,User和UserPhoto。

User
  has_many :user_photos, dependent: :destroy
  has_one :user_activity, dependent: :destroy
  has_one :subscription, dependent: :destroy

UserActivity
  belongs_to :user
  delegate :user_photos, to: :user

UserPhoto
    belongs_to :user  

我想获取所有处于“活动”状态并已订阅的用户,并在上一次进行“用户活动”时对其进行排序,并根据其拥有的照片数量对其进行排序。

目前,我有:

UserActivity.where(gender: "M")
            .joins(:user)
            .where("users.activation_state = 'active'")
            .order('user_activities.updated_at DESC')
            .includes([:user, user: [ :subscription ]])  

这将返回按上次活动更新排序的所有活动用户。

我试过添加查询片段,例如“ .joins(:user_photo).order('user.user_photos.length DESC')”,这会使上述内容感到窒息。 谁能指出我正确的方向?

编辑/更新:我使用了以下用户建议的计数器缓存,最终得到了:

UserActivity.where(gender:“ M”).joins(:user).where(“ users.activation_state ='active'”).order('user_activities.updated_at DESC').includes([:user,user:[:订阅]])。order('user_photos_count DESC')

您需要通过子查询进行排序,该子查询检索子记录的计数,例如:

order("(select count(*) from user_photos where user_photos.user_id = users.id) desc")

但是,为用户表上的user_photos维护计数器缓存将更加有效。

order("user_photos_count desc")

我可能会这样做:

class UserPhoto
  belongs_to :user, counter_cache: true
end

class User
  # You need extra column here: user_photos_count

  has_many :user_photos, dependent: :destroy
  has_one :user_activity, dependent: :destroy
  has_one :subscription, dependent: :destroy

  scope :active, -> { where(activation_state: 'active') }
  scope :with_subscription, -> { joins(:subscription) }
end

然后简单地

User.active.with_subscription.joins(:user_activities, :user_photos).order('user_activities.updated_at DESC').order(user_photos_count: desc)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM