Количество отношений, использующих arel в активной записи - PullRequest
8 голосов
/ 03 марта 2011

Мне очень тяжело разобраться, как сделать этот запрос и другие подобные ему из активной записи.

  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

На первый взгляд, это выглядит как пример Ник (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]))

Есть идеи, как это сделать?

Ответы [ 2 ]

1 голос
/ 15 июня 2011

Ну, сначала замените выбор на проект.В реляционной алгебре SELECT (ограничение) - это предложение WHERE.

Во-вторых, вы можете выполнять подвыборы.

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

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

"подвыборы" DONE!: -)

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

Да, эта статья действительно заставила меня захотеть изучать магию Ареля.

На все вопросы «Делай что-нибудь умное с Арелом» в Stackoverflow отвечают с помощью SQL.Из статей и исследований я могу сказать, что Arel - это не ActiveRecord.Несмотря на динамическую формулировку запросов, Active не может отображать результаты полностью сформированной проекции Ареля.

Вы можете указать операторов с

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

, но без подвыборов.

Обновлено: OMG, я ответил на этот вопрос 5 лет назад.Не шучу, ссылка была мертва:)

...