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 对象,以便我可以继续向它附加关系方法?如果没有,我还有什么其他选择?
你可以像下面这样做:
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)