2012-03-26 70 views
3

我有一个非常简单的关系数据库非常简单的Rails应用程序:类别有很多样本。我只想加载具有X个样本的类别。将(稍微复杂的)原始SQL查询翻译成ActiveRecord/Arel?

在普通的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

一个可能的好方法是使用counter_cache,因为这页上介绍:http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html

名为samples_count一列添加到您的分类模型:

add_column :categories, :samples_count, :integer 

在你的样品模型更新belongs_to的如下:

belongs_to :category , :counter_cache => true 

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

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

啊,非常好,干净!我正在考虑为类别添加'samples_count'列,但我不知道Rails有内置的逻辑来保持它最新(不知道我是如何错过的)。不想自己写这个,所以我没有追求:) – Flambino 2012-03-26 21:42:51