我有一个非常简单的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?是否有一种简单的方法可以做到这一点?
答案 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)