- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在我的 Rails 模型中构建一个作用域,当它被调用时,会在 7 个 bool 字段上为我提供一组嵌套的 AND 和 OR 子句。为了清楚起见,下面是一个简化了列名称的示例:
SELECT * FROM mytable
WHERE (a AND b AND c) OR (a AND d AND e) OR (a AND f AND g);
请注意 a
列出现在所有三个子句中。另一种写法是:
SELECT * FROM mytable
WHERE a AND ((b AND c) OR (d AND e) OR (f AND g));
Arel 似乎对第二种形式不太宽容。我已经非常接近以下范围:
scope :needs_any_delivery, lambda {
table = self.arel_table
common_assert = table[:a].eq(true)
where(
common_assert.and(
table[:b].eq(true).and(
table[:c].eq(false)
)
).or(
common_assert.and(
table[:d].eq(true).and(
table[:e].eq(false)
)
).or(
common_assert.and(
table[:f].eq(true).and(
table[:g].eq(false)
)
)
)
)
)
}
这会产生以下查询:
SELECT * FROM mytable
WHERE (
(a = 't' AND b = 't' AND c = 'f'
OR (a = 't' AND d = 't' AND e = 'f' OR a = 't' AND f = 't' AND g = 'f')
)
)
它很接近,但是第三个 AND
组没有与第二个 AND
组分开。我发现,如果我将一些额外的伪造 或
子句放在第三组的末尾,那么 Arel 会适本地将第三个子句单独分组......但这似乎是一个 hack。
想知道是否有任何 rails/arel 专家有任何想法。谢谢!
最佳答案
如果您像我一样真的想继续使用 Arel 来实现此功能,我发现创建新的 或
方法似乎是最佳途径。
我添加了一个名为 arel_fixed_or.rb
的新初始化器,其内容如下:
Arel::Nodes::Node.class_eval do
###
# Factory method to create a Nodes:Or that has a Nodes::Grouping
# node as a child.
def fixed_or right
Arel::Nodes::Or.new self, Arel::Nodes::Grouping.new(right)
end
end
无论您通常想在何处使用 or
语句,您都可以继续使用 fixed_or
,然后将一个 or-ed 分组语句附加到你的条款,对我来说应该是预期的方法。如果这对您没有意义,请随意删除 Arel::Nodes::Grouping
部分。
需要注意的一件事是,您可能仍然需要手动放置分组,以便用方括号括起正确的元素。例如:
table = Arel::Table.new(:mytable)
common_assert = table[:a].eq(true)
first_or = table[:b].eq(true).and(table[:c].eq(true))
second_or = table[:d].eq(true).and(table[:e].eq(true))
third_or = table[:f].eq(true).and(table[:g].eq(true))
common_assert.and(
table.grouping(
table.grouping(first_or)
.fixed_or(second_or)
.fixed_or(third_or)
)
)
它的to_sql
输出变成:
"mytable"."a" = 't' AND (
("mytable"."b" = 't' AND "mytable"."c" = 't') OR
("mytable"."d" = 't' AND "mytable"."e" = 't') OR
("mytable"."f" = 't' AND "mytable"."g" = 't')
)
关于ruby-on-rails - 使用 Arel 对 AND 和 OR 子句进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15037916/
我在看 : 有关列出哪些方法可用的引用文档? 关于如何设置和执行查询,然后构建复杂查询的教程? 检查自述文件,这里被标记为 Arel 的问题,但大多数是关于如何设置 where 子句,复杂的查询而不是
一个模型有两个感兴趣的属性,名字和城镇。我想搜索 Richard(伦敦)和 Brian(马德里)。 从长远来看, p=Person.scoped pred1=p.table[:forename].eq
让我们有一个 Rails 4.2.x 应用程序,我们有两个表 posts 和 authors,我们想使用 Arel 来获取由 name == 'Karl' 的作者创作的帖子。 (在这种情况下,我们可以
我正在尝试重构一段代码(并提高我对 Arel::Nodes::Case 的理解),我想转换此 Arel.sql 语句 Arel.sql(default_order) def defau
我正在使用 Arels 创建查询。在此查询中,我使用了 generate_series 函数。这是我的代码: def generate_series Arel::Nodes::Na
我有这个用例,我从某个模型中获得符号化的深层关联,并且我必须执行某些涉及使用外连接的查询。如何在不求助于手动编写完整 SQL 的情况下做到这一点? 我不想要的答案: - 使用包含(不能很好地解决深层关
我正在尝试使用 ARel 清理用 MySQL case 语句编写的 ActiveRecord 代码。我知道 Arel 能够处理 case 语句,但不确定如何使用它。 所以我有一个带有数量和 user_
我需要一个消息列表,其中每条消息都是当前用户与其他用户之间“对话”中的最新消息。 描述了相同的查询 in this question 我目前的代码是: t1 = Arel::Table.new(:me
我正在尝试使用 Arel#extract 方法。我在源代码中的 test_extract.rb 中的测试用例中看到了一个示例,但是当我尝试在我的应用程序中重现它时,我得到了未定义的方法。 table
我在使用 Arel 聚契约(Contract)一查询中的 2 列时遇到了问题。当我运行它时,在 rails dev-server 崩溃之前,整个服务器会卡住一分钟。我怀疑是无限循环:)。 也许我误解了
我有以下 Arel SQL: Arel.sql("(users.last_donated_at IS NOT NULL AND users.last_donated_at < '#{User::ACT
假设我有几张 table orders = Arel::Table.new :orders stores = Arel::Table.new :stores managers = Arel::Tabl
我有以下内容: class BaseReseller :merchant_owner, :dependent => :destroy end class IPSP true end class M
如果您使用 joins在 ARel 范围内,结果变为只读(即您无法更新您返回的任何记录)。如果您不希望结果是只读的,您只需链接 readonly(false)到范围,例如 User.joins(:or
我有一个 fairly complex sql query我很确定我无法使用 ARel (Rails 3.0.10) 来完成 查看该链接,但它有一些连接和一个 where isn't 子句,我很确定这
我正在尽最大努力让我的大脑围绕阿雷尔及其背后的关系代数进行思考,但如何表示SELECT DISTINCT始终让我无法理解。谁能解释一下如何设置: SELECT DISTINCT title FROM
我正在尝试抽象出有人插入我们代码库的原始 sql 主体,我们使用的是 Rails 4.2.8。我想要生成以 where 子句结尾的 sql,如下所示: WHERE col1=1 OR col2=1 O
我试图寻找一个使用 Arel::UpdateManager 来形成带有 from 子句的更新语句的示例(如 UPDATE t SET t.itty = "b"FROM .. .. WHERE ...)
我想向 Arel 添加额外的列选择结果,其中列中的值在每一行上都相同,以便我可以向 Rails ActiveRecord 对象添加有关查询上下文的额外信息。 那么,我如何使用 Arel 生成此 SQL
我正在使用 RAILS 4 和 MySQL服务通过服务场所有很多场所。 我正在尝试创建一个与以下 SQL 查询等效的 AREL: SELECT DISTINCT services . * FR
我是一名优秀的程序员,十分优秀!