ActiveRecord OR查询

时间:2010-09-03 21:23:09

标签: ruby-on-rails ruby-on-rails-3 rails-activerecord

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

  自从Rails 5开始,

编辑: OR 方法可用。请参阅ActiveRecord::QueryMethods

14 个答案:

答案 0 :(得分:196)

如果要对一列的值使用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

答案 1 :(得分:147)

在Rails 3中,它应该是

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

这还包括原始sql但我不认为ActiveRecord中有一种方法可以进行OR操作。你的问题不是一个noob问题。

答案 2 :(得分:107)

使用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%'))

答案 3 :(得分:54)

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/16052or功能将在Rails 5中提供

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

答案 4 :(得分:33)

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)

答案 5 :(得分:17)

Rails 5附带function loadanswer(){ var nos = $("#nos").val(); for(var h=0;h<nos;h++){ var lang = $("#hdn_lan_"+h).val(); var filename = $("#hdn_lanfile_"+h).val(); var pv = $("#hdn_pv_"+h).val(); $.post("ajaxCoderun.php", {filename:filename,lang:lang,pv:pv},function(data){ alert(data); $("#ca_"+h).html("<span style='color:green;'>Correct Answer is: <b>"+data+"</b></span>"); }); } } loadanswer(); 方法。 (升ink to documentation

此方法接受or个对象。例如:

ActiveRecord::Relation

答案 6 :(得分:14)

如果要将数组用作参数,则以下代码适用于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 queries with arrays as arguments in Rails 4

答案 7 :(得分: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}

答案 8 :(得分:6)

只需在条件

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

答案 9 :(得分:3)

我刚从客户工作中提取this plugin,可以将范围与.or.结合使用,例如。 Post.published.or.authored_by(current_user)。 Squeel(更新的MetaSearch实现)也很棒,但不会让你使用OR范围,因此查询逻辑可能会有点多余。

答案 10 :(得分:3)

你可以这样做:

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

或更优雅,安装rails_or gem并按照以下方式执行:

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

答案 11 :(得分:2)

使用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

答案 12 :(得分:0)

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

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

将搜索A和B。

答案 13 :(得分:-3)

Book.where.any_of(Book.where(:author => 'Poe'), Book.where(:author => 'Hemingway')