ruby-on-rails Rails ActiveRecord where子句中的Or & and

sf6xfgos  于 2023-10-21  发布在  Ruby
关注(0)|答案(4)|浏览(211)

我使用的是Rails 3.2,我有一个数据库表,我想在其中找到所有符合以下条件的行:
a =真且B =真且(0< c <1或d=1),a、B、c、d是列。
我可以有这样的东西:

Route.where(:a => true,
             :b => true,
             :c => 0..1 OR :d=1
             ).all
wqsoz72f

wqsoz72f1#

我可能错了,但我不认为你可以使用基于区域的where函数来构造查询;你需要自己建立数据库查询字符串。
假设你使用的是SQLite或Postgres:

Route.where("a = true and b = true and ((c > 0 and c < 1) or d = 1)").all

我还没有测试过这段代码,但我怀疑这可能会为你做的工作。注意,这是不太“可移植”的代码;如果你改变了你正在使用的数据库,查询可能会中断。

kulphzqa

kulphzqa2#

在Rails 4中,您还可以
Route.where(:a => true,:b => true,:c => [1,2]).all
这将找到c是1或2的地方。

zqry0prt

zqry0prt3#

我认为罗布是对的,我还没有支持手术室。关于arel site
OR运算符尚不受支持。它将像这样工作:

users.where(users[:name].eq('bob').or(users[:age].lt(25)))

AND运算符的行为类似。

hgc7kmma

hgc7kmma4#

ActiveRecords中缺少常用的方法:

Route.where(:a => true, :b => true)
     .where_one_of(:c => 0..1, :d=1)

你可以添加以下补丁:

module ActiveRecordSearch

  def where_one_of fields
    relation = nil
    fields.each do |key, value|
      next unless value.present?

      where = self.where(key => value)
      relation = relation ? relation.or(where) : where
    end
    relation
  end

end

ActiveRecord::Relation.class_eval do
  include ActiveRecordSearch
end

ActiveRecord::Base.class_eval do
  extend ActiveRecordSearch
end

相关问题