2015-09-03 3 views
0

У меня есть модель, которая должна запускать метод каждый раз, когда данные будут доступны из него или сохранены в нем. Мне сложно понять, как вызвать метод.Как вызвать метод модели при каждом доступе в Rails

Вот что я пытался:

class MyModel < ActiveRecord::Base 

    after_initialize :hello 
    def hello 
     binding.pry 
    end 
end 

Я понимаю, что after_initialize будет запускать каждый раз, когда эта модель доступна, но, видимо, это не так. Как я могу получить это, чтобы вызвать на вызов, например, как это:

@instance = MyModel.paginate() 
+0

Эй, я думаю, вы должны использовать тот же метод, который требует двух разных обратных вызовов, таких как after_save и after_find. найти больше на: http://guides.rubyonrails.org/active_record_callbacks.html –

ответ

0

Вот список всех callbacks

after_initialize, after_find, after_touch, before_validation, after_validation, 
    before_save, around_save, after_save, before_create, around_create, 
    after_create, before_update, around_update, after_update, 
    before_destroy, around_destroy, after_destroy, after_commit, after_rollback 

Вы можете запустить свой метод с любым из этих обратных вызовов. Смотрите пример

class MyModel < ActiveRecord::Base 

    after_find :hello 
    after_save :hello 
    # call_back goes here ... 

    def hello 
     binding.pry 
    end 
end 

after_initialize времени срабатывает после того, как новые объекты создаются экземплярами, как

MyModel.new() 
0

Rails не обеспечивает способ, который обычно может быть доступен в таких действиях, это делает, однако для отдельных случаев, так вы могли бы сделать что-то вроде

class MyModel < ActiveRecord::Base 
    #all cases that wanna include 
    before_save :hello 
    after_save :hello 
    after_initialize :hello 
    def hello 
     binding.pry 
    end 
end 

Проверить доступные обратные вызовы из documentation

0

after_initialize запускается после создания экземпляра, а не при его доступе. Собственно, что значит «к нему обращаются»?

Это делает огромным иначе, если вы имеете в виду, когда любой из методов объекта называются или когда методы инерционности называется и т.д.

В зависимости от ваших потребностей, вы можете использовать прокси-объект. Вы можете инкапсулировать свои экземпляры в прокси-сервер, который получает вызовы, регистрирует все, что вы хотите зарегистрировать, а затем вызывает объект. В противном случае вам нужно будет переопределить/обезвредить все методы внутри класса, что определенно не очень хорошая идея.

@instance = MethodLogger.new(@instance) 
@instance.paginate 
Смежные вопросы