Subscribed unsubscribe Subscribe Subscribe

Augmented Usamimi

it { is_expected.to be_blog.written_by(izumin5210) }

【Rails】同一テーブルを複数回JOINする

あるモデルが1つのテーブルに対して関連を2つ持っている場合がある. :before_hoge:after_hogebelongs_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::Tablearel_tableの返り値)にjoinとonしたあとにjoin_sourcesを呼び出す)
  • joinsの引数にjoin_sourcesを突っ込む

SQL力あげていこうな.