Создание подзапроса с ARel в Rails3 - PullRequest
1 голос
/ 28 декабря 2010

Я пытаюсь построить этот запрос в 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 Я неправильно подхожу к этому?Или я несколько методов от решения?

Ответы [ 2 ]

3 голосов
/ 18 марта 2011

Когда вы создаете запутанные полные запросы в Arel, нет способа превратить это в список правильных объектов ActiveRecord. Можно использовать только предикаты в Arel, то, что вы можете указать внутри функции .where ().

Эти преимущества, однако, кратко включены в драгоценный камень meta_where:

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

Примите их совет по добавлению

MetaWhere.operator_overload!

к вашему

config/initializers/meta_where.rb

так что вы можете делать что-то с функцией '[]', добавленной к символу:

Attendee.select(:count[:id].as('person_count')).group(:id)
1 голос
/ 02 января 2011

Вот как я это сделал, не используя методы Ареля:

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
...