Класс ActiveRecord::Associations::AssociationProxy
переопределяет method_missing
и перехватывает вызов, который вы ищете, прежде чем он попадет в модель.
Это происходит потому, что AP проверяет, является ли модель respond_to?
методом, который в вашемв противном случае это не так.
У вас есть несколько решений помимо редактирования исходного кода Rails:
Сначала вручную определите каждый из методов is_ * для пользовательского объекта, используя метапрограммирование.Что-то вроде:
class User
Role.all.each do |role|
define_method "is_#{role.name}?" do
has_role?(role.name)
end
end
end
Другой способ - загрузить объект User с помощью других средств, таких как
User.find(Annotation.first.user_id).is_admin?
, или использовать один из перечисленных ответов.