2011-10-10 47 views

回答

2

不,儘管Active Record可以很好地抽象出大部分抽象,但有些調用是數據庫特有的,不能像你提到的那樣被抽象化。其他人只是不能代表。像SQL CASE調用一樣,是我無法用Active Record重建的代碼示例。在一個相當大的數據集(~30000)上,循環是不可能的,因爲與SQL的速度相比,它運行時間超過20秒。

SELECT t.price_range AS price_range, count(*) as total FROM 
(
    SELECT 
    CASE 
    WHEN (price >= '0.00' AND price < '25.00') THEN '0-25' 
    WHEN (price >= '25.00' AND price < '50.00') THEN '25-50' 
    ELSE '50+' 
    END AS price_range 
    FROM products p 
    RIGHT JOIN 
    product_categories pc 
    ON 
    p.id = pc.id 
) t group by t.price_range 

我會建議使用the docs和一些判斷來做出關於何時使用SQL的決定。

+0

啊我看到了,技術上是的(如果你要在ruby中進行循環),但在應用程序中,性能成本太高了。非常感謝真實世界的生產例子。 – Jason

1

Re:ActiveRecord的聲明是否覆蓋了原始sql中可能的全部範圍?

絕對不是。例如Union語句等,但有一個很好的解決方法:將複雜的SQL創建爲SQL視圖。然後使用ActiveRecord訪問視圖。

根據視圖的dbms和SQL,AR模型可能需要也可能不需要標記爲ReadOnly。