我在这里写这个陈述:
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)
答案 0 :(得分:3)
是的,我在我给出的另一个答案中写了这个。
问题是条件中的哈希仅适用于在SQL中进行==
或IN
比较。你不能做更大或更小的比较或不等于。你必须自己写一段SQL。
where(:commentable_id => comments.map(&:id)).where("user_id != ?", current_user.id)
您的方法不起作用,因为它会将!current_user
的结果发送到SQL生成器(这是ARel gem)。根据Ruby逻辑,任何不是nil
或false
的对象都被视为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}"
这样就可以了。