【问题标题】:How to get record which have min has_many rec ords(joins data)如何获取具有最少has_many记录的记录(加入数据)
【发布时间】:2016-09-24 02:15:47
【问题描述】:

用户.rb

has_many :properties

property.rb

belongs_to :user

我想获得一个具有 min 属性的用户,比如 max 也是明智的。

我找不到与此相关的任何查询

【问题讨论】:

  • 哪些属性最小,即通过哪个字段?请详细说明

标签: ruby-on-rails ruby join activerecord


【解决方案1】:

您可以使用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

【讨论】:

    【解决方案2】:

    我认为你可以通过范围这样做

    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 记录。
    • @BoraMa, @Thorin 您可以按users.id 分组并仅选择users.id 而不是users.*,因为users.* 仅支持mysqlPG不允许选择除分组列和聚合函数以外的列
    【解决方案3】:

    要找到usermin 属性,您可以简单地做,

    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 的连接操作,所以没有propertiesuser 不会出现在此查询中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多