Activerecord或Raw SQL

时间:2017-05-22 14:18:15

标签: ruby-on-rails activerecord

我有一些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.....)

1 个答案:

答案 0 :(得分:0)

您可以使用AREL执行此操作。有关示例,请参阅Rails 3: Arel for NOT EXISTS?

我个人经常发现原始SQL比AREL查询更易读/可维护。而且我猜大多数开发人员也会更熟悉它。

但无论如何,将log_states_idlog_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不同的别名。