Arel:如何在 arel speak 中写 attr = NULL?

Posted

技术标签:

【中文标题】Arel:如何在 arel speak 中写 attr = NULL?【英文标题】:Arel: How to write attr = NULL in arel speak? 【发布时间】:2012-10-15 13:50:30 【问题描述】:

我对 arel 有疑问:我想使用 Arel 强制执行类似“attr = NULL”的操作。 Arel 允许我做这样的事情:

table = obj.arel_table # obj has attr
table[:attr].eq(nil) # returns ''objs'.'attr' IS NULL'

这是公平的,因为在查询中这是正确的做法。但是在更新时,我希望能够将某些内容设置为 NULL,并且最好不必自己编写 SQL(AR 中的 update_all 不支持集合上的类似 ARel 的功能:objs.things.update_all(:created_at => nil )。这打破了)。我基本上是在尝试在 update_all 调用中重复执行 arel 和 to_sql 功能的代码块。这可能吗?

【问题讨论】:

您确定 created_at 列允许空值吗?你的例子到底是怎么破的? 【参考方案1】:

您只需将nil 传递给eq

table[attr].eq(nil)

生成where attr is not null

【讨论】:

【参考方案2】:

我知道做这样的事情的唯一方法是使用 SqlLiteral 类似:

table[attr].eq(Arel::Nodes::SqlLiteral.new("NULL"))

这将迫使 arel 跳过 nil 的处理器并进行简单的相等

【讨论】:

这会产生= NULL,而不是IS NULL

以上是关于Arel:如何在 arel speak 中写 attr = NULL?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ARel 中使用 CONCAT() 等函数?

如何在 Rails 中对 AREL 中的子查询进行连接

如何在 Arel 中“存在于哪里”

如何在 Arel 和 Rails 中进行 LIKE 查询?

如何使用ARel对子查询进行连接?

如何使用 arel/关系代数获取不同的值