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

Ruby on rails 将(稍微复杂的)原始SQL查询转换为ActiveRecord/Arel?,ruby-on-rails,activerecord,arel,Ruby On Rails,Activerecord,Arel,我有一个非常简单的Rails应用程序和一个非常简单的关系数据库:Category有许多示例。我只想加载样本数为X的类别 在纯SQL中,我将执行以下操作: SELECT categories.* FROM categories JOIN (SELECT category_id, COUNT(*) as sample_count FROM samples GROUP BY category_id ) AS

我有一个非常简单的Rails应用程序和一个非常简单的关系数据库:Category有许多示例。我只想加载样本数为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?有没有一种更简单的方法呢?

一种可能的好方法是使用计数器缓存,如本页所述:

将名为samples\u count的列添加到类别模型中:

add_column :categories, :samples_count, :integer
在您的示例模型中,更新属于以下内容:

belongs_to :category , :counter_cache => true 
现在可以将计数用作条件,例如:

Category.where(:samples_count => 7)

啊,非常干净漂亮!我曾考虑在categories中添加一个
samples\u count
列,但我不知道Rails内置了保持最新的逻辑(不知道我怎么会错过这个)。我不想自己写,所以我没有追求:)