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

后端 未结 2 1102
时光说笑
时光说笑 2020-12-03 13:50

I have two queries, I need an or between them, i.e. I want results that are returned by either the first or the second query.

First query is a simple

相关标签:
2条回答
  • 2020-12-03 14:01

    There is a known issue about it on Github.

    According to this comment you might want to override the structurally_incompatible_values_for_or to overcome the issue:

    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
    

    Also there is always an option to use SQL:

    @items
      .joins(:orders)
      .where("orders.user_id = ? OR items.available = true", current_user.id)
    
    0 讨论(0)
  • 2020-12-03 14:03

    You can write the query in this good old way to avoid error

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

    Hope that helps!

    0 讨论(0)
提交回复
热议问题