2011-05-14 72 views
22

我想有一个地方有一个平等的条款,不等于条件:不等于条件

@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? ? (渲染 :指数):(RE ...

如果我从!=然而更改第二个条件=>它会工作,

我怎么有两个条件中的一个,其中CLASE感谢。?你

+1

@taro本周我完成了“Ruby on Rails教程:通过示例学习Rails”,但它没有涵盖这些类型的条件,所以我仍然在学习。它还建议我在开始使用Ruby之前先从Rails开始。但是谢谢你的反馈。 – user715697 2011-05-14 18:35:56

+0

您应该使用'empty?'而不是'nil?',因为'where'返回一个Array,本身。 – konyak 2015-01-27 21:00:29

回答

23

这里是你将如何使用阿雷尔生成查询“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并不像在简单条件下使用哈希条件那样简洁,但它更强大!

这里给full list of predications的链接(eqnot_eqgtlt等)可用阿雷尔。

+2

这个答案更好,因为它是更多的数据库不可知论者。例如,有些数据库不理解'!=',但其他数据库会。 – maletor 2013-08-26 21:13:58

+0

为Arel +1,它使ActiveRecord疼痛消失 – ryan0 2014-10-10 14:15:12

7

的语法错误是由于您尝试使用!=,而不是=>where方法不支持不平等与哈希参数,所以你不等于就需要使用数组参数写入。

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

谢谢道格拉斯。有没有办法使用:author_id而不是将其作为引号内的文字? (没关系,只是好奇) – user715697 2011-05-14 18:41:39

+1

我唯一可以补充的建议是看meta_where,它实际上支持的语法与你在问题中发布的语法非常相似。 https://github.com/ernie/meta_where – 2011-05-14 18:46:03

+0

+1 for meta_where – aceofspades 2011-05-15 05:46:15

21

我认为,它应该是:

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

谢谢您的工作。猜猜我无法使用.nil在一行中完成所有操作?因为我曾希望通过:) – user715697 2011-05-14 18:44:25

17

轨道4,5遭遇这一切想通了

Model.where.not(:colname => nil) 
#=> returns all records whose :colname values are not nil 
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取景器返回ActiveRecord::Relation阵列。