Переводить (немного сложный) необработанный SQL-запрос в ActiveRecord / Arel? - PullRequest
3 голосов
/ 27 марта 2012

У меня очень простое приложение на Rails с очень простой реляционной базой данных: в категории много примеров.Я просто хотел бы загрузить категории с числом выборок X.

В простом SQL я бы сделал что-то вроде этого:

SELECT
    categories.*
FROM
    categories
JOIN
    (SELECT
        category_id, COUNT(*) as sample_count
    FROM
        samples
    GROUP BY
        category_id
    ) AS subselect
ON
    categories.id=subselect.category_id
WHERE
    subselect.sample_count = X; -- where X is whatever

Кстати, это прекрасно работает,но это не очень Rails-как использовать сырой SQL.И, очевидно, я хотел бы получить эти категории в качестве экземпляров модели, поэтому:

Как бы я переписал что-то подобное в запрос ActiveRecord или Arel? Возможно ли это вообще?, или я должен идти с простым SQL?Возможно, есть какой-то более простой способ сделать это?

1 Ответ

1 голос
/ 27 марта 2012

Возможно, хорошим способом было бы использовать counter_cache, как описано на этой странице: http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html

Добавить столбец с именем samples_count в модель вашей категории:

add_column :categories, :samples_count, :integer

В вашем примере обновления модели вы можете указать следующее:

belongs_to :category , :counter_cache => true 

Теперь вы можете использовать счет в качестве условия, например:

Category.where(:samples_count => 7)
...