【问题标题】:return custom query as an activerecord relation将自定义查询作为 activerecord 关系返回
【发布时间】:2015-06-10 02:10:47
【问题描述】:

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

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 对象,以便我可以继续向它附加关系方法吗?如果没有,我还有什么其他选择?

【问题讨论】:

  • 您正在检查是否需要其 docket_type 没有此正则表达式 'Key1|Key2|Key3|Key4'..right 的记录?
  • @test 我要检索所有案卷及其相关条目,其中没有一个相关条目包含正则表达式“Key1|Key2|Key3|Key4”。这意味着如果案卷的所有条目都不包含它,那么我想要案卷和条目。如果一个条目确实包含它,那么我不想要案卷或条目。

标签: ruby-on-rails activerecord


【解决方案1】:

你可以这样做:

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

【讨论】:

  • @xdazz 当我将它转换为 sql 时,它给了我以下信息: SELECT dockets.* FROM dockets INNER JOIN entries ON entries.docket_id = dockets .id WHERE(不存在(从entries 中选择 1)(entries.docket_id = dockets.id)和(entries.docket_type REGEXP 'Key1|Key2|Key3|Key3'))))。使用这些额外的括号仍然会产生相同的结果吗?
猜你喜欢
  • 1970-01-01
  • 2012-11-15
  • 1970-01-01
  • 2019-04-21
  • 2017-04-22
  • 2013-04-25
  • 1970-01-01
  • 1970-01-01
  • 2013-09-05
相关资源
最近更新 更多