ActiveRecord或查询
你如何在Rails 3 ActiveRecord中进行OR查询。 我find的所有例子都只有AND查询。
编辑: OR方法是可用的自Rails 5.请参阅ActiveRecord :: QueryMethods
使用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%'))
如果你想在一列的值上使用一个OR运算符,你可以将一个数组传递给。而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操作。 你的问题不是一个简单的问题。
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
function将在Rails 5中可用
更新:function已被合并到Rails 5分支
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))
更多信息: 在数组中作为参数的OR查询 。
Rails 5带有一个or
一个方法。 (l 墨水到文件 )
这个方法接受一个ActiveRecord::Relation
对象。 例如:
User.where(first_name: 'James').or(User.where(last_name: 'Scott'))
只需在条件中添加一个OR即可
Model.find(:all, :conditions => ["column = ? OR other_column = ?",value, other_value])
MetaWhere插件是完全惊人的。
轻松混合OR和AND,在任何关联上join条件,甚至指定OUTER JOIN!
Post.where({sharing_level: Post::Sharing[:everyone]} | ({sharing_level: Post::Sharing[:friends]} & {user: {followers: current_user} }).joins(:user.outer => :followers.outer}
我只是从客户端工作中提取这个插件 ,让你把范围与.or.
结合起来.or.
,例如。 Post.published.or.authored_by(current_user)
。 Squeel(MetaSearch的更新实现)也很好,但是不会让你的OR范围,所以查询逻辑可以有点冗余。
你可以这样做:
Person.where("name = ? OR age = ?", 'Pearl', 24)
或更优雅,安装rails_orgem,并像这样做:
Person.where(:name => 'Pearl').or(:age => 24)
用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')