【发布时间】:2016-09-24 02:15:47
【问题描述】:
用户.rb
has_many :properties
property.rb
belongs_to :user
我想获得一个具有 min 属性的用户,比如 max 也是明智的。
我找不到与此相关的任何查询
【问题讨论】:
-
哪些属性最小,即通过哪个字段?请详细说明
标签: ruby-on-rails ruby join activerecord
用户.rb
has_many :properties
property.rb
belongs_to :user
我想获得一个具有 min 属性的用户,比如 max 也是明智的。
我找不到与此相关的任何查询
【问题讨论】:
标签: ruby-on-rails ruby join activerecord
您可以使用counter_cache。
:counter_cache 选项可用于更有效地查找所属对象的数量。
来自here
belongs_to :user, counter_cache: true
然后创建迁移:
def self.up
add_column :users, :properties_count, :integer, :default => 0
User.reset_column_information
User.find(:all).each do |u|
User.update_counters u.id, :properties_count => u.properties.length
end
end
然后你可以获取最大properties_count的用户
User.maximum("properties_count")
这是一个很棒的 RailsCast 关于 counter_cache
【讨论】:
我认为你可以通过范围这样做
class User
has_many :properties
scope :max_properties,
select("users.id, count(properties.id) AS properties_count").
joins(:properties).
group("properties.id").
order("properties_count DESC").
limit(1)
scope :min_properties,
select("users.id, count(properties.id) AS properties_count").
joins(:properties).
group("properties.id").
order("properties_count ASC").
limit(1)
只需调用 User.max_properties 和 User.min_properties
更新:
它也可以像 BoraMa 建议的那样工作
class User
has_many :properties
scope :max_properties,
select("users.*, count(properties.id) AS properties_count").
joins(:properties).
group("users.id").
order("properties_count DESC").
limit(1)
scope :min_properties,
select("users.*, count(properties.id) AS properties_count").
joins(:properties).
group("users.id").
order("properties_count ASC").
limit(1)
【讨论】:
users.id 而不是properties.id 分组,这样才能正常工作。此外,您可以选择 users.* 而不仅仅是 id,以便返回的用户可用作具有所有属性的普通 rails 记录。
users.id 分组并仅选择users.id 而不是users.*,因为users.* 仅支持mysql。 PG不允许选择除分组列和聚合函数以外的列
要找到user 和min 属性,您可以简单地做,
User.joins(:properties).group("properties.user_id").order("count(properties.user_id) desc").last
并找到具有max 属性的user,
User.joins(:properties).group("properties.user_id").order("count(properties.user_id) desc").first
注意:因为它是与properties 的连接操作,所以没有properties 的user 不会出现在此查询中。
【讨论】: