【问题标题】:Boolean combinations of Sequel datasetsSequel 数据集的布尔组合
【发布时间】:2014-03-31 18:44:01
【问题描述】:

鉴于我有一些数据集方法 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) &amp;&amp; (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>))

&lt;dataset xyz&gt; 表示我定义的数据集。所以

&lt;dataset foo&gt; 定义为(c = 42 AND d = 23)

&lt;dataset bar&gt; 定义为((a = 5 AND b = 23) OR (a = 23, b = 5))

&lt;dataset baz&gt; 定义为(d = 17)

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

【问题讨论】:

  • 实际上,您要完成的不是内部连接吗?
  • 不,我正在尝试在同一张表上组合不同的数据集。不需要加入。
  • 在您的示例中,所有数据都来自用户表,对吗?仅仅因为您只使用一张表doesn't mean you can't do a join
  • 但我不想加入。我只想合并数据集。
  • 请修正您的代码,它无效::a =&gt; 23, b: =&gt; 5。此外,dataset_methods 方法从何而来?在 Ruby 2.1.0 和 Sequel 4.8.0 上运行固定代码,它会引发 NoMethodError: undefined method `dataset_methods' for User:Class

标签: ruby sequel


【解决方案1】:

您不是在寻找联合和交集方法吗?这些适用于数据集,可用作集合论中“AND”和“OR”的替代品。

这样的东西不适合你吗?

fooOrbar = User.foo.union(User.bar)
barOrbaz = User.bar.union(User.baz)
result = fooOrbar.intersect(barOrbaz)

【讨论】:

  • 是的,这将返回给定的数据,但它会生成一个包含UNIONINTERSECT 的查询。我想得到一个只包括ANDOR 的查询。
【解决方案2】:

我相信你的方法应该返回后续表达式,看看:http://sequel.jeremyevans.net/rdoc/classes/Sequel/SQL.html

【讨论】:

  • 不,他们没有,因为数据集模块返回数据集。我正在寻找一种组合数据集的方法(不仅仅是与AND 链接,如Model.dataset1.dataset2,而是与ANDOR 和括号 - 就像问题中一样)。
猜你喜欢
  • 1970-01-01
  • 2012-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-18
  • 2013-03-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多