不等于有条件的

时间:2011-05-14 18:14:56

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

我希望where子句具有相等且不相等的条件:

@user = User.where(:user_id => current_user.id, :author_id != current_user.id).nil? ? (render :something) : (render :somethingelse)

以上不起作用:

  

语法错误,意外')',   期待tASSOC ... d,:user_id!=   current_user.id).nil? ? (渲染   :index):(重新......

如果我将第二个条件从!=更改为=>,它将起作用。

如何在一个clase中同时具备这两个条件?谢谢

6 个答案:

答案 0 :(得分:23)

以下是使用Arel生成查询“select * from users where user_id = ? and author_id != ?”的方法:

users = User.arel_table
User.where(users[:user_id].      eq(current_user.id).and(
           users[:author_id].not_eq(current_user.id)))

使用Arel并不像在简单条件下使用哈希条件那样简洁,但它的功能更强大了!

以下是Arel提供的full list of predicationseqnot_eqgtlt等)的链接。

答案 1 :(得分:21)

我相信,它应该是:

@user = User.where(['user_id = ? AND author_id <> ?', current_user.id, current_user.id])
render(@user ? :something : :somethingelse)

答案 2 :(得分:18)

Rails 4已经解决了这个问题

Model.where.not(:colname => nil)
#=> returns all records whose :colname values are not nil

答案 3 :(得分:7)

语法错误是由于您尝试使用!=而不是=>where方法不支持使用散列参数的不等式,因此需要使用数组参数来编写不相等的内容。

User.where(:user_id => current_user.id).where(['users.author_id <> ?', current_user.id])

答案 4 :(得分:0)

http://guides.rubyonrails.org/active_record_querying.html#hash-conditions

  

只有使用哈希条件才能进行相等,范围和子集检查。

您需要下拉到直接SQL或反转和查询,请参阅Is there a way to invert an ActiveRecord::Relation query?

答案 5 :(得分:0)

不确定您是否知道,不相等的条件通常与(author_id)NULL值不匹配。如果你愿意的话,你必须做OR author_id IS NULL

@users = User.where("user_id = ? AND (author_id != ? OR author_id IS NULL)", 
                    current_user.id, current_user.id)

render(@users.present? ? :something : :somethingelse)

另请注意,我正在使用@users.present?,因为where finder会返回ActiveRecord::Relation数组。