2

I have this error message Relation passed to #or must be structurally compatible. Incompatible values: [:joins]

in my user model: has_many :orders

in my order model: belongs_to :user, optional: true

How I am supposed to write my query to have either the users' names and the order id in the same search input?

def filter_orders
  return if params[:query].blank?
  @orders = Order.joins(:user).where('lower(users.first_name) LIKE ?', "%#{params[:query][:keyword]}%")
  .or(Order.joins(:user).where('lower(users.last_name) LIKE ?', "%#{params[:query][:keyword]}%"))
  .or(Order.where(id: "#{params[:query][:keyword]}.to_i"))
end
johan
  • 721
  • 5
  • 21

2 Answers2

1

It sound like this is a know issue with .or. Try using SQL or you can override .or as seen in this answer: https://stackoverflow.com/a/40742512/10987825

Noah
  • 550
  • 2
  • 8
0

It occurs when you try to combine two multi-active records of the same type, but one of them has a reference value or an includes value, or in your case a joins value, that the other does not. Therefore we need to match the values between them, and I found a general way to do this without knowing the actual values in advance.

def filter_orders
  return if params[:query].blank?

  orders_1 = Order.joins(:user).where('lower(users.first_name) LIKE ?', "%#{params[:query][:keyword]}%")
  
  orders_2 = Order.joins(:user).where('lower(users.last_name) LIKE ?', "%#{params[:query][:keyword]}%")

  orders_3 = Order.where(id: "#{params[:query][:keyword]}.to_i")

  joind_orders = orders_1.or(
                         orders_2
                               .joins(orders_1.joins_values)
                               .includes(orders_1.includes_values)
                               .references(orders_1.references_values)
                   )

  @orders = joind_orders.or(
                         orders_3
                               .joins(joind_orders.joins_values)
                               .includes(joind_orders.includes_values)
                               .references(joind_orders.references_values)
                   )

end
Roi Dayan
  • 757
  • 7
  • 8