Какой правильный синтаксис для `! Current_user` - PullRequest
0 голосов
/ 13 декабря 2010

Я пишу это утверждение здесь:

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

Проблема в том, что возвращается только пользователь с идентификатором 0. Предполагается, что это не пользователь, а точнее -! Пользователь.

В этом случае я просто пытаюсь сказать кого-либо, кроме текущего пользователя .

Как бы вы это написали?

Использование "not #{current_user.id} возвращает:

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

Ответы [ 2 ]

3 голосов
/ 14 декабря 2010

Да, я написал это в другом ответе, который я дал.

Проблема в том, что хеши в условиях хороши только для сравнения == или IN в SQL. Вы не можете делать большие или меньшие сравнения или не равно. Вы должны написать фрагмент кода SQL самостоятельно.

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

Ваш подход не работает, потому что он отправит результаты !current_user в генератор SQL (который является самоцветом ARel). Согласно логике Ruby, любой объект, который не является nil или false, считается true. Когда вы помещаете перед ним «взрыв» (восклицательный знак), он будет делать, если false. А ARel попытается преобразовать false в любую базу данных, которая будет восприниматься как false. Большинство баз данных не понимают логические значения, и для этого они используют другие методы. SQLite использует 't' и 'f', а MySQL использует 1 и 0 (я полагаю).

2 голосов
/ 13 декабря 2010
where :commentable_id => comments.map(&:id), :user_id => "<> #{current_user.id}"

Это сделает это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...