2017-05-22 11 views
-1

私はいくつかのRAW SQLを持っていますが、それがActiverecord呼び出しとしては良いかどうか、またはRAW SQLを使うべきかどうかはわかりません。これはARに変換するのは簡単でしょうか?ActiverecordまたはRaw SQL

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

あなたはこの使用ARELを行うことができます。例については、Rails 3: Arel for NOT EXISTS?を参照してください。

個人的に私は、生のSQLがARELクエリよりも読みやすく保守的であることがよくあります。そして、私は、ほとんどの開発者が一般的にそれにもっと精通していると思います。

いずれにしても、サブクエリからの絞り込みをlog_states_idlog_type_idで区切る方法はお勧めです。たとえあなたの.where.not構成が書かれたように機能しなくても。

しかしこれはトリックを行う必要があります:あなたは、外側のテーブルの可能性が高いlogsとは異なる別名を受け取ることになりますので、他のクエリにこのクエリに参加しようとすると、

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) 

を、これが問題になるかもしれない唯一の星座です。

+0

どのように見えないのですか?私はt2、t1を持っていないと思いますか? – user3437721

+0

メインテーブルは通常(そのため、最後の注意文を追加した理由です)サブテーブルから参照できるように名前を保持します。私は完全なクエリを表示するために私の答えを更新しました。 –

関連する問題