【问题标题】:Building a subquery with ARel in Rails3在 Rails3 中使用 ARel 构建子查询
【发布时间】:2011-05-31 08:54:56
【问题描述】:

我正在尝试在 ARel 中构建此查询:

SELECT FLOOR(AVG(num)) FROM (
SELECT COUNT(attendees.id) AS num, meetings.club_id FROM `meetings` INNER JOIN `attendees` ON `attendees`.`meeting_id` = `meetings`.`id` WHERE (`meetings`.club_id = 1) GROUP BY meetings.id) tmp
GROUP BY tmp.club_id

它返回每个俱乐部每次会议的平均出席人数。 (一个俱乐部有很多会议,一个会议有很多参加者)

到目前为止,我已经(在 Club

num_attendees = meetings.select("COUNT(attendees.id) AS num").joins(:attendees).group('meetings.id')
Arel::Table.new('tmp', self.class.arel_engine).from(num_attendees).project('FLOOR(AVG(num))').group('tmp.club_id').to_sql

但是,我得到了错误:

undefined method `visit_ActiveRecord_Relation' for #<Arel::Visitors::MySQL:0x9b42180>

生成非平凡 ARel 查询的文档有点难找。我一直在使用http://rdoc.info/github/rails/arel/master/frames 我是不是用错了方法?还是我离解决方案还有一些方法?

【问题讨论】:

    标签: sql ruby-on-rails subquery arel


    【解决方案1】:

    当您在 Arel 中构建复杂的完整查询时,无法将其转换为适当的 ActiveRecord 对象列表。只能使用 Arel 中的谓词,即您可以在 .where() 函数中指定的内容。

    然而,这些优点被简洁地包装在 meta_where gem 中:

    http://metautonomo.us/projects/metawhere/
    

    听取他们关于添加的建议

    MetaWhere.operator_overload!
    

    给你的

    config/initializers/meta_where.rb
    

    这样您就可以使用添加到符号的 '[]' 函数来执行操作:

    Attendee.select(:count[:id].as('person_count')).group(:id)
    

    【讨论】:

    • MetaWhere 已被 Squeel 弃用,而 Squeel 现在已弃用且无需替换。 arel-helpers 是侵入性较小且当前受支持的解决方案:github.com/camertron/arel-helpers
    【解决方案2】:

    这就是我在不使用 Arel 方法的情况下完成它的方式:

    sql = 'SELECT FLOOR(AVG(num)) AS avg FROM ('
    sql << meetings.select("COUNT(attendees.id) AS num, meetings.club_id").joins(:attendees).group('meetings.id').to_sql
    sql << ') AS tmp GROUP BY tmp.club_id'
    connection.select_value(sql, 'avg').to_i
    

    【讨论】:

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