🖥

#Rails の ActiveRecord の OR条件をつなげる時は、 joins などの構造が矛盾せず、一致していなければいけないらしい

に公開

このエラー何?

User
  .left_joins(:books)
  .where.not(books: {user_id: nil}).or(
	User
	  .left_joins(:lovers)
	  .where.not(lovers: {user_id: nil})
  )
 ( ArgumentError: Relation passed to #or must be structurally compatible. Incompatible values: [:left_outer_joins] )

メインの方にも、ORの方にも、両方に全く同じ joins をつけなければいけないみたいだ!

なんか冗長だよね?でも、そうなんだよ。

User
  .left_joins(:books)
  .left_joins(:lovers)
  .where.not(books: {user_id: nil}).or(
	User
	  .left_joins(:books)
	  .left_joins(:lovers)
	  .where.not(lovers: {user_id: nil})
  )

Scope とかにまとめておくと良いかもしれないね!

class User < ApplicationRecord
...
  scope :useful_joins, -> do
    .left_joins(:books)
    .left_joins(:lovers)
  end
end
User
  .useful_joins
  .where.not(books: {user_id: nil}).or(
    User
      .useful_joins
	  .where.not(lovers: {user_id: nil})
  )

Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2236

チャットメンバー募集

何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ

Twitter

https://twitter.com/YumaInaura

公開日時

2019-07-03

Discussion