将自定义查询作为activerecord关系返回

时间:2015-06-10 02:10:47

标签: ruby-on-rails activerecord

我写了这个自定义查询,我不认为可以使用活动记录查询界面很好地转换:

SELECT * FROM dockets 
INNER JOIN entries 
ON entries.docket_id = dockets.id 
WHERE NOT EXISTS 
( 
  SELECT 1 FROM entries AS e 
  WHERE e.docket_id = dockets.id 
  AND e.docket_type REGEXP 'Key1|Key2|Key3|Key4' 
)

我可以使用connection.execute执行此查询:

sql = "SELECT * FROM dockets INNER JOIN entries ON entries.docket_id = dockets.id WHERE NOT EXISTS ( SELECT 1 FROM entries AS e WHERE e.docket_id = dockets.id AND e.docket_type REGEXP 'Key1|Key2|Key3|Key4' )"
Docket.connection.execute(sql)

问题是不返回ActiveRecord :: Relation。它给了我一个MySQL :: Result对象。因此,我无法在其中附加关系方法:

Docket.connection.execute(sql).limit(10)
NoMethodError: undefined method `limit' for #<Mysql2::Result:0x007fcd1dde6330> 

是否有另一个接口我可以用来返回一个ActiveRecord :: Relation对象,以便继续向它添加关系方法?如果没有,我还有其他选择吗?

1 个答案:

答案 0 :(得分:0)

你可以这样做:

Docket.joins(:entry).where(Entry.select('1')
     .where("entries.dockect_id = dockets.id")
     .where("entries.docket_type REGEXP 'Key1|Key2|Key3|Key4'")
 .exists.not)