Отношение, переданное в # или должно быть структурно совместимым. Несовместимые значения: [: ссылки]
У меня есть два запроса, мне нужен 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)
Надеюсь, что это поможет!