K M*_*lam 106 ruby activerecord ruby-on-rails rails-activerecord ruby-on-rails-5
你如何or在Rails 5 ActiveRecord中进行查询?此外,是否有可能链or与where在ActiveRecord的查询?
K M*_*lam 217
Rails 5中提供了在查询中链接or子句和where子句的能力.请参阅相关讨论和拉取请求.ActiveRecord
因此,您将能够在Rails 5中执行以下操作:
为了得到一个post与id1或2:
Post.where('id = 1').or(Post.where('id = 2'))
Run Code Online (Sandbox Code Playgroud)
其他一些例子:
(A && B)|| C:
Post.where(a).where(b).or(Post.where(c))
Run Code Online (Sandbox Code Playgroud)
(A || B)&& C:
Post.where(a).or(Post.where(b)).where(c)
Run Code Online (Sandbox Code Playgroud)
(只是KM拉基布尔伊斯兰教的答案的补充。)
使用范围,代码可以变得更漂亮(取决于外观):
scope a, -> { where(a) }
scope b, -> { where(b) }
scope a_or_b, -> { a.or(b) }
Run Code Online (Sandbox Code Playgroud)
我需要做一个 (A && B) || (C && D) || (E && F)
但是在Rails 5.1.4的当前状态下,使用Arel或链完成此操作太复杂了。但是我仍然想使用Rails生成尽可能多的查询。
所以我做了一个小技巧:
在我的模型中,我创建了一个私有方法sql_where:
private
def self.sql_where(*args)
sql = self.unscoped.where(*args).to_sql
match = sql.match(/WHERE\s(.*)$/)
"(#{match[1]})"
end
Run Code Online (Sandbox Code Playgroud)
接下来,在我的作用域中,我创建了一个数组来保存OR的值
scope :whatever, -> {
ors = []
ors << sql_where(A, B)
ors << sql_where(C, D)
ors << sql_where(E, F)
# Now just combine the stumps:
where(ors.join(' OR '))
}
Run Code Online (Sandbox Code Playgroud)
将会产生预期的查询结果:
SELECT * FROM `models` WHERE ((A AND B) OR (C AND D) OR (E AND F))。
现在,我可以轻松地将其与其他范围等相结合,而不会出现任何错误的OR。
我的sql_where接受普通的where子句参数:sql_where(name: 'John', role: 'admin')会产生好处
(name = 'John' AND role = 'admin')。
| 归档时间: |
|
| 查看次数: |
38499 次 |
| 最近记录: |