Когда я устанавливаю патч обезьяны ActiveRecord :: Base с помощью методов класса, методы наследуются различными классами класса ActiveRecord_Relation (например, User :: ActiveRecord_Relation) и могут быть вызваны экземплярами конкретных активных отношений записи. Но это вызывает некоторое неожиданное поведение при совершении активных вызовов записи для исходной модели.Почему методы перехвата обезьян на ActiveRecord :: Base переопределяют несвязанные методы на Model.count
Вот тривиальный пример:
User.count
=> 3544
users = User.where("created_at > ?", 1.month.ago)
users.count
=> 174
class ActiveRecord::Base
def self.monkey_foo(options = {}, &block)
User.count
end
end
User.monkey_foo
=> 3544
Book.monkey_foo # Another model
=> 3544
users.monkey_foo
=> 173 # This is the count of the users relation, not the User model
Book.where("created_at > 1.year.ago").monkey_foo
=> 3544 # Issue only affects User model relations
Что вызывает такое поведение?
Я знаю, что исправление обезьяны, как будто это довольно плохая идея для чего-то серьезного. Я случайно обнаружил это поведение, и мне очень любопытно узнать, почему это происходит.
Что вы хотите сказать? –
Я думаю, вопрос в том, что происходит с 'users.monkey_foo' –
Да. Я могу отредактировать вопрос, чтобы сделать это более ясным. –