2011-10-10 55 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。