将(稍微复杂的)原始SQL查询转换为ActiveRecord / Arel?

时间:2012-03-26 21:11:57

标签: ruby-on-rails activerecord arel

我有一个非常简单的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

顺便说一句,这样做很好,但是使用原始SQL并不是很糟糕。显然我想把这些类别作为模型实例,所以:

我如何重写这样的东西到ActiveRecord或Arel查询?它是否可行,或者我应该使用纯SQL?是否有一种简单的方法可以做到这一点?

1 个答案:

答案 0 :(得分:1)

一种可能的好方法是使用counter_cache,如本页所述:http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html

将名为samples_count的列添加到Category模型中:

add_column :categories, :samples_count, :integer

在您的示例模型中更新belongs_to,如下所示:

belongs_to :category , :counter_cache => true 

您现在可以将计数用作条件,例如:

Category.where(:samples_count => 7)