我正在尝试在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< ActiveRecord :: Base类中声明):
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我接近这个错误吗?或者我是一种远离解决方案的方法?
答案 0 :(得分:3)
当您在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)
答案 1 :(得分:1)
这是我在不使用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