鉴于我有一些数据集方法foo
,bar
和baz
class User < Sequel::Model
dataset_module do
def foo
# Some complicated dataset here
where(:c => 42, :d => 23)
end
def bar
# Even more complicated dataset here
where(:a => 5, :b => 23).or(:a => 23, :b => 5)
end
def baz
where(:d => 17)
end
end
end
我想查询数据库(foo || bar) && (bar || baz)
(或其他一些复杂的数据集)。所以我试过
User.where{|u| (u.foo | u.bar) & (u.bar | u.baz)}
编辑:澄清:
SELECT * FROM users WHERE ((`foo` OR `bar`) AND (`bar` OR `baz`))
SELECT * FROM users WHERE ((<dataset foo> OR <dataset bar>) AND (<dataset bar> OR <dataset baz>))
其中<dataset xyz>
表示我定义的数据集。所以
<dataset foo>
定义为(c = 42 AND d = 23)
<dataset bar>
定义为((a = 5 AND b = 23) OR (a = 23, b = 5))
<dataset baz>
定义为(d = 17)
如何使用AND
,OR
和(最重要的)括号链接数据集方法?
答案 0 :(得分:1)
您不是在寻找联合和交叉方法吗?这些工作在数据集上,可以在集合论中用作“AND”和“OR”的替代。
这样的东西不适合你吗?
fooOrbar = User.foo.union(User.bar)
barOrbaz = User.bar.union(User.baz)
result = fooOrbar.intersect(barOrbaz)
答案 1 :(得分:0)
我相信你的方法应该返回续集表达式,请看:http://sequel.jeremyevans.net/rdoc/classes/Sequel/SQL.html