Rails 5:ActiveRecord OR查询
你如何做Rails 5 ActiveRecord or
查询? 此外,是否有可能链or
与ActiveRecord查询的地方?
在ActiveRecord
查询中的where
子句中链or
子句的能力将在Rails 5中提供 。 请参阅相关的讨论和拉取请求 。
所以,你将能够在Rails 5中做以下事情:
要获得id
1或2的post
:
Post.where('id = 1').or(Post.where('id = 2'))
其他一些例子:
(A && B)|| C:
Post.where(a).where(b).or(Post.where(c))
(A || B)&& C:
Post.where(a).or(Post.where(b)).where(c)
我们不需要等待rails 5来使用这个OR
查询。 我们也可以用rails 4.2.3
来使用它。 这里有一个backport。
感谢Eric-Guo的gem ,或者 ,现在我们可以在>= rails 4.2.3
使用这个gem来添加这个OR
function。
我需要做(A && B) || (C && D) || (E && F)
(A && B) || (C && D) || (E && F)
但是在Rails 5.1.4
的当前状态下,使用Arel或者Chain来完成这个过程非常复杂。 但是我仍然想用Rails来尽可能多的生成查询。
所以我做了一个小黑客:
在我的模型中,我创build了一个名为sql_where
的私有方法:
private def self.sql_where(*args) sql = self.unscoped.where(*args).to_sql match = sql.match(/WHERE\s(.*)$/) "(#{match[1]})" end
接下来在我的范围内,我创build了一个数组来保存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 ')) }
这将产生预期的查询结果: 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')
。