Да, я написал это в другом ответе, который я дал.
Проблема в том, что хеши в условиях хороши только для сравнения ==
или 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 (я полагаю).