【Rails】同一テーブルを複数回JOINする
あるモデルが1つのテーブルに対して関連を2つ持っている場合がある.
:before_hoge
と:after_hoge
にbelongs_to
している場合とか.
そういうときに両方の関連をJOINするにはArel
を利用しなければならない.
以下がコード.
belongs_to :before_event, class_name: 'Event' belongs_to :after_event, class_name: 'Event' scope :mendokusai_kensaku, -> do before = Event.arel_table.alias('before_event') after = Event.arel_table.alias('after_event') before_join = arel_table.join(before, Arel::Nodes::OuterJoin) .on(before[:id].eq arel_table[:before_event_id]).join_sources after_join = arel_table.join(after, Arel::Nodes::OuterJoin) .on(after[:id].eq arel_table[:after_event_id]).join_sources joins(before_join, after_join) # .where(なんか.and めんどくさそうな.or 検索条件) end
events
を2つJOINするのでaliasを付けないといけないArel::Table
(arel_table
の返り値)にjoinとonしたあとにjoin_sources
を呼び出す)joins
の引数にjoin_sources
を突っ込む
SQL力あげていこうな.