Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/52.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails activerecord能否将用户定义的sql放入from子句中?_Ruby On Rails_Activerecord - Fatal编程技术网

Ruby on rails activerecord能否将用户定义的sql放入from子句中?

Ruby on rails activerecord能否将用户定义的sql放入from子句中?,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我试图建立一个拉一些数据出来,并显示它的应用程序。为了提取数据,我们有大量特定于站点的oracle sql存储过程、奇怪的表达式等等 我需要做的一种方法是创建oracle视图,然后将activerecord指向这些视图。但是我宁愿把所有的SQL都放在一个地方——ruby应用程序本身——而不是放在oracle和ruby中。我想在一个原始的SQL select子句上创建一个活动记录对象,然后能够使用所有常用的活动记录 现在,我知道Oracle SQL支持这一点。让我们来看看: select n.na

我试图建立一个拉一些数据出来,并显示它的应用程序。为了提取数据,我们有大量特定于站点的oracle sql存储过程、奇怪的表达式等等

我需要做的一种方法是创建oracle视图,然后将activerecord指向这些视图。但是我宁愿把所有的SQL都放在一个地方——ruby应用程序本身——而不是放在oracle和ruby中。我想在一个原始的SQL select子句上创建一个活动记录对象,然后能够使用所有常用的活动记录

现在,我知道Oracle SQL支持这一点。让我们来看看:

select n.name_id, name, munge(n.name) as munged from name
通常,您会创建一个视图munged_名称,一个类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在FROM子句中将sql select用作子查询:

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会这样做吗?我会继续查找-在这里得到答案之前,看看是否能找到答案:。

我怀疑传递该SQL片段应该有效

MungedName.from("select n.name_id, name, munge(n.name) as munged from name").like(:name , 'Foo%')
但您可能正在寻找更像Ruby的东西,所以您当然也可以从Arel中的片段生成:

sql = Name.select([:name_id, :name, "munge(name)"]).to_sql
MungedName.from(sql).like(:name , 'Foo%')
我没有从命令行尝试任何这类操作。我怀疑我所输入的内容是否能干净地工作,但想法基本上是一样的。Arel可用于生成复杂的SQL,并将该SQL输入到另一个Arel查询中

我不确定from部分的具体情况,但我怀疑它会像预期的那样工作。如果签出方法源:


SqlLiteral类只是一种绕过任何引用或诸如此类的方法。

查看代码-它不会工作。没有self.from=方法。当您在表名称中插入原始sql时,它会引用它,并将其视为表名称。这很公平。ActiveRecordRuby在整个过程中都有一个“引用的表名”

然而,associations.rb上有一条有趣的评论:

# == Table Aliasing
#
# Active Record uses table aliasing in the case that a table is referenced multiple times
# in a join. If a table is referenced only once, the standard table name is used. The
# second time, the table is aliased as <tt>#{reflection_name}_#{parent_table_name}</tt>.
# Indexes are appended for any more successive uses of the table name.
如果可以说服activerecord即使在没有联接的情况下也始终为MungedName模型别名,并使用一些未引用的内容作为from的内容,那么这可能会奏效。不过,我得把图书馆修缮一下

# == Table Aliasing
#
# Active Record uses table aliasing in the case that a table is referenced multiple times
# in a join. If a table is referenced only once, the standard table name is used. The
# second time, the table is aliased as <tt>#{reflection_name}_#{parent_table_name}</tt>.
# Indexes are appended for any more successive uses of the table name.