我在模型中有两个范围。两者都使用joins
。 joins
似乎与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,但我在应用它时遇到了麻烦。
答案 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