如何将多个作用域与 OR 组合

How to combine multiple scopes with OR

Rails 6

我有三个瞄准镜

scope :a, -> { where("first_name like 'A%'") }
scope :b, -> { where("first_name like 'B%'") }
scope :c, -> { where("first_name in ('Charles','Chris')") }

我想合并这三个作用域并创建一个新的作用域,例如

scope :combined_abc, -> { where("first_name like 'A%'") or 
                          where("first_name like 'B%'") or 
                          where("first_name in ('Charles','Chris')") 
                        }

我正在寻找一种干净漂亮的方法来预定义大范围,而不是在 SQL 中使用三个 OR 条件。

我的最终目标是删除名字以“a”、“b”开头或名字为'Charles'或'Chris'的用户。

user.combined_abc.destory_all

您可以使用正则表达式组合它们:

scope :combined_abc, -> { where("first_name like '[A-C]%'")}

在 Postgres 中,您可以使用正则表达式:

where first_name ~ '^(A|B|Charles|Chris)'

你应该可以这样写:

where("first_name ~ '^(A|B|Charles|Chris)")

Rails 从 5.

支持 ActiveRecord::Relation #or
scope :combined_abc, -> { a.or(b).or(c) }

注意:a/b/c必须在结构上兼容。