2012-03-26 76 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