ActiveRecord 或查询

问题描述 投票:0回答:14

如何在 Rails 3 ActiveRecord 中进行 OR 查询。我找到的所有示例都只有 AND 查询。

编辑: OR 方法自 Rails 5 起可用。请参阅 ActiveRecord::QueryMethods

ruby-on-rails ruby-on-rails-3 rails-activerecord
14个回答
237
投票

如果要对一列的值使用 OR 运算符,可以将数组传递给

.where
,ActiveRecord 将使用
IN(value,other_value)
:

Model.where(:column => ["value", "other_value"]

输出:

SELECT `table_name`.* FROM `table_name` WHERE `table_name`.`column` IN ('value', 'other_value')

这应该相当于单列上的

OR


177
投票

在 Rails 3 中,应该是

Model.where("column = ? or other_column = ?", value, other_value)

这也包括原始sql,但我认为ActiveRecord中没有办法进行OR操作。你的问题不是菜鸟问题。

Rails 5 添加了,因此现在在 Rails 版本大于 5 的应用程序中这会更容易:

Model.where(column: value).or(Model.where(other_column: other_value))

这也可以处理

nil


115
投票

使用ARel

t = Post.arel_table

results = Post.where(
  t[:author].eq("Someone").
  or(t[:title].matches("%something%"))
)

生成的 SQL:

ree-1.8.7-2010.02 > puts Post.where(t[:author].eq("Someone").or(t[:title].matches("%something%"))).to_sql
SELECT     "posts".* FROM       "posts"  WHERE     (("posts"."author" = 'Someone' OR "posts"."title" LIKE '%something%'))

74
投票

Rails/ActiveRecord 的更新版本可能原生支持此语法。它看起来类似于:

Foo.where(foo: 'bar').or.where(bar: 'bar')

如本拉取请求中所述 https://github.com/rails/rails/pull/9052

目前,只要坚持以下几点就可以了:

Foo.where('foo= ? OR bar= ?', 'bar', 'bar')

更新:根据https://github.com/rails/rails/pull/16052

or
功能将在Rails 5中可用

更新:功能已合并到Rails 5分支


43
投票

Rails 最近将其添加到 ActiveRecord 中。它看起来将在 Rails 5 中发布。已经致力于掌握:

https://github.com/rails/rails/commit/9e42cf019f2417473e7dcbfcb885709fa2709f89

Post.where(column: 'something').or(Post.where(other: 'else'))

# => SELECT * FROM posts WHERE (column = 'something') OR (other = 'else)

26
投票

Rails 5 带有一个

or
方法。 (l链接到文档

此方法接受一个

ActiveRecord::Relation
对象。例如:

User.where(first_name: 'James').or(User.where(last_name: 'Scott'))

15
投票

如果你想使用数组作为参数,以下代码适用于 Rails 4:

query = Order.where(uuid: uuids, id: ids)
Order.where(query.where_values.map(&:to_sql).join(" OR "))
#=> Order Load (0.7ms)  SELECT "orders".* FROM "orders" WHERE ("orders"."uuid" IN ('5459eed8350e1b472bfee48375034103', '21313213jkads', '43ujrefdk2384us') OR "orders"."id" IN (2, 3, 4))

更多信息:Rails 4 中使用数组作为参数的 OR 查询


7
投票

MetaWhere 插件非常棒。

轻松混合 OR 和 AND,连接任何关联的条件,甚至指定 OUTER JOIN!

Post.where({sharing_level: Post::Sharing[:everyone]} | ({sharing_level: Post::Sharing[:friends]} & {user: {followers: current_user} }).joins(:user.outer => :followers.outer}

5
投票

只需在条件中添加 OR 即可

Model.find(:all, :conditions => ["column = ? OR other_column = ?",value, other_value])

4
投票

用rails+arel,更清晰的方式:

# Table name: messages
#
# sender_id:    integer
# recipient_id: integer
# content:      text

class Message < ActiveRecord::Base
  scope :by_participant, ->(user_id) do
    left  = arel_table[:sender_id].eq(user_id)
    right = arel_table[:recipient_id].eq(user_id)

    where(Arel::Nodes::Or.new(left, right))
  end
end

产品:

$ Message.by_participant(User.first.id).to_sql 
=> SELECT `messages`.* 
     FROM `messages` 
    WHERE `messages`.`sender_id` = 1 
       OR `messages`.`recipient_id` = 1

4
投票

你可以这样做:

Person.where("name = ? OR age = ?", 'Pearl', 24)

或更优雅,安装 rails_or gem 并执行以下操作:

Person.where(:name => 'Pearl').or(:age => 24)

3
投票

我刚刚从客户工作中提取了这个插件,它可以让您将范围与

.or.
结合起来,例如。
Post.published.or.authored_by(current_user)
。 Squeel(MetaSearch 的较新实现)也很棒,但不允许您使用 OR 范围,因此查询逻辑可能会有点多余。


-4
投票

我想补充一下,这是一个搜索 ActiveRecord 的多个属性的解决方案。自从

.where(A: param[:A], B: param[:B])

将搜索 A 和 B。


-4
投票

使用

activerecord_any_of
gem,你可以写

Book.where.any_of(Book.where(:author => 'Poe'), Book.where(:author => 'Hemingway')
© www.soinside.com 2019 - 2024. All rights reserved.