我正在尝试构建一个“提取一些数据并显示它”的应用程序。为了提取数据,我们有大量特定于站点的 oracle sql(存储过程、奇怪的表达式等等)。
我需要做的一种方法是创建 oracle 视图,然后将 activerecord 指向这些视图。但我宁愿将所有 SQL 放在一个地方——ruby 应用程序本身——而不是在 oracle 和 ruby 中。我想在原始 SQL 选择子句上创建一个活动记录对象,然后能够使用所有常用的活动记录对象。
现在 - 我知道 Oracle SQL 支持这一点。让我们来:
select n.name_id, name, munge(n.name) as munged from name
通常你会创建一个视图 munged_name,一个类 MungedName,结果是
MungedName.like(:name , 'Foo%')
将(最终)生成如下所示的 SQL:
select T1.name_id, T1.name, T1.munged
from munged_name as T1
where T1.name like 'Foo%'
然而,我想做的是让 ActiveRecord 使用 sql select 作为 FROM 子句中的子查询:
select T1.name_id, T1.name, T1.munged
from (select n.name_id, name, munge(n.name) as munged from name) as T1
where T1.name like 'Foo%'
直接把它塞进去——甲骨文会完美地优化它。这样,我的人想要做的所有奇怪的查询都在一个地方 - 在模型类定义中。
ActiveRecord 会这样做吗?我会继续寻找——看看我能不能在我在这里得到答案之前找到答案:)。