续集数据集的布尔组合

时间:2014-03-25 12:32:28

标签: ruby sequel

鉴于我有一些数据集方法foobarbaz

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)

如何使用ANDOR和(最重要的)括号链接数据集方法?

2 个答案:

答案 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