如何使用 AREL 执行条件 where 子句

Posted

技术标签:

【中文标题】如何使用 AREL 执行条件 where 子句【英文标题】:How can you do a conditional where clause using AREL 【发布时间】:2011-09-07 20:00:37 【问题描述】:

如何做一个条件 where 子句?我有一个运行查询的 rake 任务。假设我正在构建这样的查询:

residentials = Residential.where(:is_active => true)

现在,如果我将某个参数传递给 rake 任务,我想添加到 where 子句。我在想这样的事情:

residentials.where(:something_else => true) if param_was_passed

但这只是替换了现有的 where 子句。如何将其添加到现有的 where 子句中?

【问题讨论】:

此参数是否适用于您的 Residential 模型中的特定字段? 其实你这里没有使用 arel。 【参考方案1】:

可以链接 where 语句

residentials = Residential.where(:is_active => true)
residentials = residentials.where(:other_thing => true) if param_was_passed

这应该可行。

确保这不是函数调用的最后一行;在这种情况下,将 residentials 变量作为最后一行重复。 (根据@digger69 评论)

【讨论】:

这就是我尝试过的,但没有奏效。我会再次检查并在此处添加输出 这应该可以工作,但如果你依赖从函数返回的 this 则要小心,因为函数返回最后一条语句的值,如果 !param_was_passed 则为 nil【参考方案2】:

您可以构建散列,然后将其提供给.where 方法。比如:

h =  
h[:is_active] = true
h[:field_x] = true if param_was_passed

residentials = Residential.where(h)

【讨论】:

这种情况下where('created_at > ?', 10.days.ago)怎么办?

以上是关于如何使用 AREL 执行条件 where 子句的主要内容,如果未能解决你的问题,请参考以下文章

是否有关于如何使用 AREL 或参考文档的教程?

ActiveRecord Arel OR 条件

如何在rails中添加条件where子句

如何在 WHERE 子句中使用条件不同的列?

JDBC WHERE子句条件实例

Hive 中带有 Join 或 Where 子句的条件