如何在Rails 3 ActiveRecord中执行OR查询。我发现的所有示例都具有AND查询。
编辑:OR方法自Rails 5起可用。请参见ActiveRecord :: QueryMethods
Post.where(column: 'something').or(Post.where(other: 'else'))
如何在Rails 3 ActiveRecord中执行OR查询。我发现的所有示例都具有AND查询。
编辑:OR方法自Rails 5起可用。请参见ActiveRecord :: QueryMethods
Post.where(column: 'something').or(Post.where(other: 'else'))
Answers:
使用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%'))
matches
将为LIKE
sqlite(默认情况下不区分大小写)和ILIKE
postgres(需要显式不区分大小写的运算符)生成。
如果要对一列的值使用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
在单列上达到等效
在Rails 3中,应该是
Model.where("column = ? or other_column = ?", value, other_value)
这也包括原始sql,但是我不认为ActiveRecord中有一种方法可以执行OR操作。您的问题不是菜鸟问题。
Page.where("pages.column = ? or pages.other_column = ?", value, other_value)
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分支
or
现在可以使用Rails 5,但不能以这种方式实现,因为它希望传递1个参数。它期望一个Arel对象。查看已接受的答案
or
如果直接使用ActiveRecord中的方法,则可以使用该方法:但是如果将其用于随后被链接的作用域,则可能会超出预期。
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)
如果要使用数组作为参数,则以下代码可在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查询。
Order.where(query.where_values.inject(:or))
一路使用Arel。
只需在条件中添加OR
Model.find(:all, :conditions => ["column = ? OR other_column = ?",value, other_value])
使用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
Book.where.any_of(Book.where(:author => 'Poe'), Book.where(:author => 'Hemingway')