将自定义查询作为活动记录关系返回

Don*_*ato 5 activerecord ruby-on-rails

我写了这个自定义查询,我认为使用活动记录查询接口不能很好地转换它:

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' 
)
Run Code Online (Sandbox Code Playgroud)

我可以使用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)
Run Code Online (Sandbox Code Playgroud)

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

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

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

xda*_*azz 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)
Run Code Online (Sandbox Code Playgroud)