如何在Rails 3 ActiveRecord中进行OR查询。我发现的所有示例都只有AND查询。
自从Rails 5开始,编辑: OR 方法可用。请参阅ActiveRecord::QueryMethods
答案 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/16052,or
功能将在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))
答案 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')