不能在find_by_sql中使用子句

时间:2012-09-19 07:08:03

标签: ruby-on-rails activerecord

Activerecord似乎正在偷看我的SQL并弄错了。我发现了这个:

sql = "
  select etn.* 
  from edittree_name etn where id = #{id}"  
Name.find_by_sql(sql)

有效,但是:

sql = "
  with pp as ( select * from dual)
  select etn.* 
  from edittree_name etn where id = #{id}"  
Name.find_by_sql(sql)

给我一​​个“未定义的方法`每个'1:Fixnum”。

任何线索?是否有“find_by_raw_sql(并且不要试图自己理解)”方法?

1 个答案:

答案 0 :(得分:-1)

确定。问题解决了。

RoR中的某些东西就像那些oracle“with”子句一样,问题似乎是RoR希望首先看到“select”子句。 您可以通过将with子句转换为from子句来解决此问题。

with xx(parent) as (
  select parent from link where
    link.child = {#id}
  union all
  select parent from xx, link 
    where link.child = xx.parent
)
select foo.*
from foo,xx 
where foo.id = xx.parent

变成这个

select foo.*
from foo, 
(
  with xx(parent) as (
    select parent from link 
      where link.child = {#id}
    union all
    select parent from xx, link 
      where link.child = xx.parent
  )
  select * from xx
) yy
where foo.id = yy.parent

问题似乎是rails需要正确解析新的sql语法