ArgumentError:传递给#or的关系必须在结构上兼容。不兼容的值:[:join]

时间:2017-09-15 23:10:56

标签: ruby-on-rails ruby

我在模型中有两个范围。两者都使用joinsjoins似乎与Rails 5或查询不兼容。

示例:

class Blog < ApplicationRecord

  has_many :comments

  scope :with_comment_likes, -> {joins(:comments).merge(Comment.some_scope_on_comment)}
  scope :some_other_comment_merge_scope, -> {joins(:comments).merge(Comment.other_scope)}

  scope :aggregate_or_scope, -> {with_comment_likes.or(some_other_comment_merge_scope)}
end

Blog.aggregate_or_scope

返回错误:

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

有关如何解决此问题的任何建议?我很难过。我确实看到this question,但我在应用它时遇到了麻烦。

3 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,发现的解决方案是:

def matching_one_or_two temp = Model.matching_one + Model.matching_two Model.where('id in (?)',temp.map(&:id)) end

当然不是世界上性能最高的,但是它会导致一个ActiveRecord :: Relation对象指向“ OR”结果。

答案 1 :(得分:1)

聚会晚了两年,但是您可以通过以下方式实现此目的:

class Blog < ApplicationRecord

  has_many :comments

  scope :aggregate_or_scope, lambda {
    joins(:comments).merge(
      Comment.some_scope_on_comment.or(Comment.other_scope)
    )
  }
end

Blog.aggregate_or_scope

这里的区别是您只加入一次,并且or在正在合并的Comment查询中,该查询没有任何joins,而不是Blog查询哪个。

答案 2 :(得分:0)

经过许多小径。这是有效的解决方案:

def self.aggregate_or_scope
  with_comment_likes_id = with_comment_likes.pluck(:id)
  some_other_comment_merge_scope_id = some_other_comment_merge_scope.pluck(:id)
  all_ids = with_comment_likes_id.concat(some_other_comment_merge_scope_id)
  
  Blog.where(id: all_ids)
end