使用 Rails ActiveRecord 查询接口查找 a 的平均数量在两个模型之间有很多关联

Posted

技术标签:

【中文标题】使用 Rails ActiveRecord 查询接口查找 a 的平均数量在两个模型之间有很多关联【英文标题】:Finding the average number of a has many association between two models using Rails ActiveRecord query interface 【发布时间】:2021-12-12 04:56:46 【问题描述】:

假设我有两个模型::User 和:Ringtone。 A :User 可以有多个 :Ringtones 并且一个 :Ringtone 属于一个用户。我希望能够使用 ActiveRecord 查询接口来计算属于:User 的平均铃声数量,但我正在努力弄清楚如何。

使用原始 sql 我可以得到如下数据:

  ActiveRecord::Base.connection.execute("
            (with tones_count as 
                (select 
                user_id, count(ringtones.id)
                from 
                ringtones
                group by 1)
            select avg(count) from tones_count)").values

但这并不理想,我更希望能够使用 ActiveRecord 进行此查询/计算...

【问题讨论】:

这里的一切都很好。 ActiveRecord 查询接口不擅长做任何比最琐碎的数据库计算更多的事情,而且你想出的东西很可能会降低性能或降低可读性。 【参考方案1】:

I would much rather be able to use ActiveRecord,你可以这样做

    table = Arel::Table.new(:ringtones)
    Ringtone.from(
      Ringtone.select(
        table[:user_id], 
        table[:id].count.as("tones_count")
      ).group(1)
    ).average("tones_count")

【讨论】:

以上是关于使用 Rails ActiveRecord 查询接口查找 a 的平均数量在两个模型之间有很多关联的主要内容,如果未能解决你的问题,请参考以下文章

Rails ActiveRecord 查询不等于

使用ActiveRecord的查询:: QueryMethods并返回ActiveRecord_Relation rails

Rails Activerecord 关系:使用子查询作为 SQL 选择语句的表

Mysql 5.7 json 数据类型,在 Rails 5 中使用 activerecord 查询

Rails:将复杂的 SQL 查询转换为 Arel 或 ActiveRecord

如何使用 Arel(大概)创建一个不影响 Rails 3 中的查询的 ActiveRecord 范围?