【发布时间】:2019-10-29 05:15:11
【问题描述】:
我有(我认为)this question 的反面。
我有一个通常包含在某些 ActiveRecord 模型中的模块 (ActiveConcern):
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
现在我正在编写一个需要调用这个 calculate_score 的 rake 任务:
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
【问题讨论】:
标签: ruby-on-rails activerecord module rake mixins