我有一个Rails 4应用,该应用具有警报模型和与每个警报相关的测试。
创建新警报时,我有一个after_create过滤器,该过滤器使用实例方法创建新测试:
class Alert < ActiveRecord::Base
has_many :tests
after_create :create_test
private
def create_test
#bunch of code using external api to get some data
Test.create
end
end
我还有一个cron作业,我想使用它为每个警报创建一个新测试。我的计划是要使用一个类方法来做到这一点:
def self.scheduled_test_creation
@alerts = Alert.all
@alerts.each do |a|
a.create_test
end
end
那是行不通的,因为实例方法是私有的。我知道我可以使用例如send来解决这个问题。或者,我可以将这些方法公开。或者,我可以在实例方法中重写那堆api代码。
我只是不确定最好的方法是什么。我不想编写相同的代码两次,并且我想确保这是一种良好的做法。也许在这种情况下,方法不必是私有的-我知道public / private / protected之间的区别,但是我并不真正了解何时应该私有/保护方法。
任何帮助将不胜感激
我喜欢用于多个模型之间交互的服务类。回调会使逻辑很难遵循。
例如:
class AlertCreator
def initialize(alert)
@alert = alert
end
def call
if @alert.save
alert_test = TestBuilder.new(@alert).call
alert_test.save
true
end
end
end
class TestBuilder
def initialize(alert)
@alert = alert
end
def call
# external API interaction stuff
# return unsaved test
end
end
在控制器内部,您可以调用AlertCreator.new(@alert).call
而不是通常的@alert.save
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句