1

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を使用していますが、これにアプローチするのは間違っていますか? それとも、解決策から離れたいくつかの方法がありますか?

4

2 に答える 2

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)
于 2011-03-18T16:02:48.083 に答える
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
于 2011-01-01T21:49:46.557 に答える