31

Rails で Arel を使用する - をActiveRecord::Relation効果的に作成する方法を探していますがSELECT * FROM table、さらに操作することができます。

たとえば、複数のカテゴリに分割されたモデルがあり、次の方法でこれらのカウントを返します。

relation = Model.where(:archived => false) # all non-archived records
record_counts = {
  :total => relation.count,
  :for_sale => relation.where(:for_sale => true).count
  :on_auction => relation.where(:on_auction => true).count
}

COUNTこれは問題なく動作し、実際にレコード自体を選択するのではなく、MySQL に対してクエリを実行できるという利点があります。

ただし、アーカイブされたレコードをカウントに含める必要がありますが、relation = Model.all結果は にArrayなり、探しているのはActiveRecord::Relationです。

これを実行する唯一の方法は です。これはmodel.where(model.arel_table[:id].not_eq(nil))機能しますが、少しばかげているように思えます。

誰でもこれに光を当てることができますか?

4

3 に答える 3

48

試してみてくださいrelation = Model.scoped。これにより、実際の結果ではなく関係が得られます。

于 2011-04-08T13:40:40.597 に答える
1

あなたが望むでしょう:

relation = Model.scoped

関係が何であるかがわかれば、それは実際にはActiveRecord::Relationです。

このページからわかるように:

http://api.rubyonrails.org/classes/ActiveRecord/NamedScope/ClassMethods.html#method-i-scoped

次のように述べています。

匿名スコープは、手続き的に複雑なクエリを生成する場合に役立つ傾向があり、中間値 (スコープ) をファーストクラス オブジェクトとして渡すと便利です。

于 2011-04-08T13:46:28.610 に答える