6

次のようにActiveRecordでサブクエリを使用したいと思います。

User.select(
    'users.*, 
    (select sum(amount) 
        from subscriptions 
        where subscriptions.user_id = user.id
        and created_at < ? ) as amt)'
).order('amt')

ただし、最後から2行目では、のメソッドが複数のパラメーター(SQL文字列)を受け入れないため、Timeクラスパラメーターをバインドする方法がわからないという問題があります。私は何をしますか?ActiveRecord::Baseselect

4

1 に答える 1

9

ActiveRecord::Sanitizationクラスメソッドの1つを使用できます。

これらは混合されActiveRecord::Base、ほとんどすべて保護されているため、モデルでクラスメソッドを定義することで最も簡単にアクセスできます。

class User < ActiveRecord::Base
  def self.select_with_args(sql, args)
    query = sanitize_sql_array([sql, args].flatten)
    select(query)
  end
end

データをフェッチし、それらのパフォーマンスをサブクエリメソッドと比較する他の方法を探すことも価値があります。たとえば、別のクエリでサブスクリプション数を取得できます。

subs_by_user = Subscription.group(:user_id).where('created_at < ?', d).count()
于 2012-10-25T07:31:16.747 に答える