`!current_user`的正确语法是什么?

时间:2010-12-13 20:53:22

标签: ruby-on-rails syntax

我在这里写这个陈述:

where :commentable_id => comments.map(&:id), :user_id => !current_user

问题是它只返回id为0的用户。假设这是一个非用户,或者更具体地说是一个!用户。

在这种情况下,我只想说除了当前用户之外的任何人

你会怎么写?

使用"not #{current_user.id}返回:

SELECT "comments".* FROM "comments" WHERE ("comments"."user_id" = 0)

2 个答案:

答案 0 :(得分:3)

是的,我在我给出的另一个答案中写了这个。

问题是条件中的哈希仅适用于在SQL中进行==IN比较。你不能做更大或更小的比较或不等于。你必须自己写一段SQL。

where(:commentable_id => comments.map(&:id)).where("user_id != ?", current_user.id)

您的方法不起作用,因为它会将!current_user的结果发送到SQL生成器(这是ARel gem)。根据Ruby逻辑,任何不是nilfalse的对象都被视为true。当你在它之前放置一个“感叹号”(感叹号)时,它将成为false。并且ARel将尝试将false in转换为任何数据库理解为false。大多数数据库不了解布尔值,他们使用不同的其他方法。 SQLite使用't''f',MySQL使用1和0(我相信)。

答案 1 :(得分:2)

where :commentable_id => comments.map(&:id), :user_id => "<> #{current_user.id}"

这样就可以了。