8

私は、このクエリを実行する方法を理解するのに非常に苦労しています。

  select users.id, 
         users.name, 
         maps.count as map_count, 
  from users
  left join (select user_id, count(map_id) as count from maps_users group by user_id) maps on users.id = maps.user_id

表面的には、Nik の例 (http://magicscalingsprinkles.wordpress.com/2010/01/28/why-i-wrote-arel/) のように見えます。

photo_counts = photos.
group(photos[:user_id]).
project(photos[:user_id], photos[:id].count)

users.join(photo_counts).on(users[:id].eq(photo_counts[:user_id]))

しかし、アクティブレコードを使用してレールで動作させることはできません。同等のものはこのようなものであるべきだと思いますが、エラーになります:(

  maps = Map.arel_table
  map_counts = Map.group(maps[:owner_id]).
                   select(maps[:owner_id]).
                   select(maps[:id].count.as("map_count"))
  users = User.joins(map_counts).on(User.arel_table[:id].eq(map_counts[:map_count]))

それを行う方法についてのアイデアはありますか?

4

2 に答える 2

1

まず、selectをprojectに置き換えます。関係代数では、SELECT(制限)はWHERE句です。

次に、サブ選択を行うことができます。

sub_restriction = b.
                   where( b[:domain].eq(1) ).
                   project( b[:domain] )

restriction = a.
               where( a[:domain].in sub_restriction )

「サブセレクション」完了!:-)

于 2011-06-15T15:05:35.170 に答える
-2

ええ、あの記事を読んで私もアレル魔法を習いたくなりました。

Stackoverflow に関する「Arel でインテリジェントな処理を行う」という質問はすべて、SQL を使用して回答を得ています。記事や調査から、Arel は ActiveRecord ではないと言えます。クエリの動的定式化にもかかわらず、Active には、完全に形成された Arel プロジェクションの結果をマッピングする機能がありません。

演算子を指定する機能が得られます

https://github.com/activerecord-hackery/squeel

ただし、副選択はありません。

更新: OMG、5 年前にこの質問に回答しました。リンクが死んでいたのは冗談ではありません:)

于 2011-03-18T14:26:11.153 に答える