Ruby on rails ActiveRecord的语句是否涵盖了原始sql中可能的全部范围?

Ruby on rails ActiveRecord的语句是否涵盖了原始sql中可能的全部范围?,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,换句话说,任何复杂的sql语句(非db特定的sql代码)都可以分解为组成ActiveRecord语句吗?出于论证的考虑,我没有考虑性能或对数据库的多次调用,这当然可以通过原始SQL避免。否。虽然Active Record对大多数抽象都做得相当好,但有些调用是特定于数据库的,不能像您提到的那样进行抽象。其他人根本无法代表。类似于SQL CASE调用的代码就是我无法用活动记录重构的一个例子。在一个相当大的数据集30000上,循环是不可能的,因为与SQL的速度相比,运行循环需要20秒以上 SELECT

换句话说,任何复杂的sql语句(非db特定的sql代码)都可以分解为组成ActiveRecord语句吗?出于论证的考虑,我没有考虑性能或对数据库的多次调用,这当然可以通过原始SQL避免。

否。虽然Active Record对大多数抽象都做得相当好,但有些调用是特定于数据库的,不能像您提到的那样进行抽象。其他人根本无法代表。类似于SQL CASE调用的代码就是我无法用活动记录重构的一个例子。在一个相当大的数据集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

我建议使用和一些判断来做出关于何时使用SQL的明智决定。

否。虽然Active Record对大多数抽象都做得相当好,但有些调用是特定于数据库的,不能像您提到的那样进行抽象。其他人根本无法代表。类似于SQL CASE调用的代码就是我无法用活动记录重构的一个例子。在一个相当大的数据集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
我建议使用SQL和一些判断来做出关于何时使用SQL的明智决定

Re:ActiveRecord的语句是否涵盖了原始sql中可能的全部范围

绝对不是。但是有一个很好的解决方法:创建复杂的SQL作为SQL视图。然后使用ActiveRecord访问该视图

根据视图的dbms和SQL,AR模型可能需要标记为只读,也可能不需要标记为只读

Re:ActiveRecord的语句是否涵盖了原始sql中可能的全部范围

绝对不是。但是有一个很好的解决方法:创建复杂的SQL作为SQL视图。然后使用ActiveRecord访问该视图


根据视图的dbms和SQL,AR模型可能需要标记为只读,也可能不需要标记为只读

啊,我明白了,如果你用ruby做循环,那么从技术上讲是可以的,但在应用程序中,性能成本实在太高了。非常感谢您提供的真实生产示例。啊,我明白了,如果您使用ruby进行循环,那么从技术上讲是可以的,但是在应用程序中,性能成本实在太高了。非常感谢您提供的真实生产示例。