【发布时间】:2014-03-31 18:44:01
【问题描述】:
鉴于我有一些数据集方法 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 和(最重要的)括号链接数据集方法?
【问题讨论】:
-
实际上,您要完成的不是内部连接吗?
-
不,我正在尝试在同一张表上组合不同的数据集。不需要加入。
-
在您的示例中,所有数据都来自用户表,对吗?仅仅因为您只使用一张表doesn't mean you can't do a join。
-
但我不想加入。我只想合并数据集。
-
请修正您的代码,它无效:
:a => 23, b: => 5。此外,dataset_methods方法从何而来?在 Ruby 2.1.0 和 Sequel 4.8.0 上运行固定代码,它会引发NoMethodError:undefined method `dataset_methods' for User:Class。