使用多个条件子句构建ActiveRecord查询

时间:2015-08-25 23:36:11

标签: ruby-on-rails activerecord

使用ActiveRecord,您可以构建如下查询:

query = MyModel.where(value_one: true)
if (condition)
  query.where(value_two: true)
else
  query
end

但是,当有多个条件时,我遇到了问题:

query = MyModel.where(value_one: true)
query.where(value_two: true) if condition_two
query.where(value_three: true) if condition_three
query

在这种情况下,它只会检查value_one是否为真。有趣的是,如果我:

query = MyModel.where(value_one: true)
query.where(value_two: true)
query.where(value_three: true)

然后它会检查value_onevalue_three是否为真,但不是value_two。任何人都明白为什么会这样,以及如何让查询子句正确地相互构建?

1 个答案:

答案 0 :(得分:2)

当您链接查询或范围时,ActiveRecord会返回另一个具有附加条件的Relation对象;它不会修改原始对象。要修改关系,您需要链接查询并分配结果,例如:

query = MyModel.where(value_one: true)
query = query.where(value_two: true) if condition_two
query = query.where(value_three: true) if condition_three
query

请注意,在您尝试通过to_seach等提取数据之前,查询实际上并未执行。