У меня есть (я думаю) обратный этот вопрос .
У меня есть модуль (ActiveConcern), который обычно включен в некоторые модели ActiveRecord:
module IntegrityScoring
extend ActiveSupport::Concern
included do
before_save :calculate_score, if: :has_changes_to_save?
end
def calculate_score
# do some work
end
end
Теперь я пишу задание на грабли, которое должно вызвать это calc_score:
task seed_weights: :environment do
include IntegrityScoring # * this line throws an error *
Contact.all.each do |contact|
contact.score = contact.calculate_score
contact.save
end
end
Выдается ошибка:
undefined method `before_save' for Object:Class
В контексте задачи rake обратный вызов before_save
не имеет смысла (и фактически выдает ошибку, так как этот метод здесь не существует, поскольку это не модель ActiveRecord, а просто PORO).
Очевидно, я мог бы удалить код included
из модуля и добавить обратный вызов before_save
для каждого класса, который включает в себя модуль.
Но я надеюсь, что более простым решением было бы добавить условие к included
, чтобы before_save добавлялся только в модели ActiveRecord. Это даже возможно ... что-то вроде:
included 'only if including class is type of ActiveRecord' do
before_save :calculate_score, if: :has_changes_to_save?
end