我有一些RAW sql,我不确定它是否会更好作为Activerecord调用或我应该使用RAW sql。这很容易转换为AR吗?
select *
from logs t1
where
log_status_id = 2 and log_type_id = 1
and not exists
(
select *
from logs t2
where t2.log_version_id = t1.log_version_id
and t2.log_status_id in (1,3,4)
and log_type_id = 1
)
ORDER BY created_at ASC
这样的事情?:
Log.where(:log_status_id=>2, log_type_id => 1).where.not(Log.where.....)
答案 0 :(得分:0)
您可以使用AREL执行此操作。有关示例,请参阅Rails 3: Arel for NOT EXISTS?。
我个人经常发现原始SQL比AREL查询更易读/可维护。而且我猜大多数开发人员也会更熟悉它。
但无论如何,将log_states_id
和log_type_id
的缩小与子查询分开的方法是个好主意。即使你的.where.not
结构不能按照书面形式工作。
这应该可以解决问题:
Log.where(log_status_id: 2, log_type_id: 1)
.where("NOT EXISTS (
select *
from logs t2
where t2.log_version_id = logs.log_version_id
and t2.log_status_id in (1,3,4)
and t2.log_type_id = logs.log_type_id)")
.order(:created_at)
这可能会成为问题的唯一星座是当您尝试将此查询加入其他查询时,因为外表可能会收到与logs
不同的别名。