복붙노트

[SQL] #OR에 전달 관계는 구조적으로 호환되어야합니다. 호환 값 : : 참고 문헌]

SQL

#OR에 전달 관계는 구조적으로 호환되어야합니다. 호환 값 : : 참고 문헌]

나는 두 개의 쿼리를 가지고, 나는이 필요하거나 그들 사이에, 즉 내가 첫 번째 또는 두 번째 쿼리 중 하나에 의해 반환되는 결과를 원한다.

첫 번째 쿼리는 가능한 모든 항목을 유도 할 수있는 간단한 ()입니다.

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

두 번째는 ()가 가입 포함하고 현재 사용자의 항목을 제공합니다.

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

나는 레일 '또는 다양한 형태를 포함하여 () 메서드 이러한 결합을 시도 :

@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. ==============================

    1.Github에서에 그것에 대해 알려진 문제가 있습니다.

    Github에서에 그것에 대해 알려진 문제가 있습니다.

    이 댓글에 따르면, 당신은 문제를 극복하기 위해 structurally_incompatible_values_for_or를 오버라이드 (override) 할 수 있습니다 :

    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. ==============================

    2.당신은 오류를 방지하기 위해이 옛 방식으로 쿼리를 작성할 수 있습니다

    당신은 오류를 방지하기 위해이 옛 방식으로 쿼리를 작성할 수 있습니다

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

    희망이 도움이!

  3. from https://stackoverflow.com/questions/40742078/relation-passed-to-or-must-be-structurally-compatible-incompatible-values-r by cc-by-sa and MIT license