如何将多个作用域与 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
必须在结构上兼容。
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
必须在结构上兼容。