轨道上的红宝石 - 不等于有条件的



我想有一个具有相等和不等于条件的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? ?(渲染 :索引) : (重新...

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

我如何在一个地方同时拥有两个条件?谢谢

以下是使用 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 并不像在简单条件下使用 Hash 条件那样简洁,但它的功能要强大得多!

这是 Arel 提供的谓词(eqnot_eqgtlt等)的完整列表的链接。

我相信

,它应该是:

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

Rails 4 已经弄清楚了这一切

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

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

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

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

哈希条件只能进行相等、范围和子集检查。

您需要下拉到直接 SQL 或反转和 arel 查询,请参阅有没有办法反转 ActiveRecord::关系查询?

不确定您是否知道,不相等条件通常与 (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因为查找器返回一个ActiveRecord::Relation数组。

相关内容

  • 没有找到相关文章

最新更新