Sql Rails 4 ActiveRecord查询用户加入和订购';s协会记录的数量
我有3个模型,UserActivity、User和UserPhotoSql 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
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对象回来——否则我就不得不重构一些视图。但我确实使用了计数器缓存。