Отношение, переданное в # или должно быть структурно совместимым. Несовместимые значения: [: ссылки]

У меня есть два запроса, мне нужен or между ними, то есть я хочу, чтобы результаты возвращались либо первым, либо вторым запросом.

Первый запрос - это простой метод where() который получает все доступные элементы.

@items = @items.where(available: true)

Второй включает в себя join() и дает текущие элементы пользователя.

@items =
  @items
  .joins(:orders)
  .where(orders: { user_id: current_user.id})

Я попытался объединить их с методом Rails or() в различных формах, включая:

@items =
  @items
  .joins(:orders)
  .where(orders: { user_id: current_user.id})
  .or(
    @items
    .joins(:orders)
    .where(available: true)
  )

Но я продолжаю сталкиваться с этой ошибкой, и я не уверен, как исправить это.

Relation passed to #or must be structurally compatible. Incompatible values: [:references]

Ответ 1

На Github есть известная проблема.

Согласно этому комментарию вы можете переопределить structurally_incompatible_values_for_or преодолеть проблему:

def structurally_incompatible_values_for_or(other)
  Relation::SINGLE_VALUE_METHODS.reject { |m| send("#{m}_value") == other.send("#{m}_value") } +
    (Relation::MULTI_VALUE_METHODS - [:eager_load, :references, :extending]).reject { |m| send("#{m}_values") == other.send("#{m}_values") } +
    (Relation::CLAUSE_METHODS - [:having, :where]).reject { |m| send("#{m}_clause") == other.send("#{m}_clause") }
end

Также всегда есть возможность использовать SQL:

@items
  .joins(:orders)
  .where(
    "orders.user_id = ? OR items.available = true",
    current_user.id
  )

Ответ 2

Вы можете написать запрос старым способом, чтобы избежать ошибки

@items = @items.joins(:orders).where("items.available = ? OR orders.user_id = ?", true, current_user.id)

Надеюсь, что это поможет!