Sql Rails 4 ActiveRecord查询用户加入和订购';s协会记录的数量

Sql Rails 4 ActiveRecord查询用户加入和订购';s协会记录的数量,sql,ruby-on-rails,activerecord,Sql,Ruby On Rails,Activerecord,我有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 UserP

我有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\u photo).order('user.user\u photos.length DESC')之类的查询片段,这会导致上述问题阻塞。谁能给我指出正确的方向吗

编辑/更新:我按照以下用户的建议使用了计数器缓存,结果是:

UserActivity.where(性别:“M”) .joins(:用户) .where(“users.activation_state=‘active’”) .order('user_activities.updated_at DESC')
.includes([:user,user:[:subscription]])。order('user\u photos\u count DESC')

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

order("(select count(*) from user_photos where user_photos.user_id = users.id) desc")
但是,在用户表上维护用户照片的计数器缓存会更有效

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)

谢谢,这很好,我开始这么做了,但是由于前面的人编写它的方式,我需要一个UserActivity对象回来——否则我就不得不重构一些视图。但我确实使用了计数器缓存。