在Rails中构建依赖关系 - 是否有比after_create更好的模式?

时间:2013-07-17 03:28:32

标签: ruby-on-rails model

我有一个需要大量依赖的模型......它看起来像这样:

after_create :create_dependencies

def create_dependencies
  create_foo
  create_bar
  create_baz
  # ...
end

这实际上污染了我的模型类,带有一堆废话。还有另一种方法可以解决这个问题吗?我希望使用表单对象或类似的东西,但我想确保所有这些对象都有它们的依赖关系,无论是什么,即使通过命令行,在测试套件中创建等。

2 个答案:

答案 0 :(得分:0)

我的第一反应是创建一个像你提到的Form对象(as described by Ryan Bates)。但是,如果您直接保存模型,则不会创建任何依赖项。

您可以采取的一种方法是将依赖项创建重构为一个单独的类:

# lib/my_model_dependency_creator.rb
class MyModelDependencyCreator
  def initialize(my_model)
    @my_model = my_model
  end

  def create_dependencies
    create_foo
    create_bar
    # etc
  end

  private
  def create_foo
    # create dependency associated with @my_model
  end

  def create_bar
  end
end

然后在你的模型类中:

...
after_create :create_dependencies
def create_dependencies
  MyModelDependencyCreator.new(self).create_dependencies
end

答案 1 :(得分:0)

首先,有关观察者的想法吗?

其次,我想提取代码并不难。

#include this module in your model
module AutoSaveDependency
  def auto_save_dependencies *deps
    @@auto_save_dependencies = deps
  end

  def auto_save
    @@auto_save_dependencies.each {|dep| send "create_#{dep}" }
  end

  def self.included(model)
    model.send :after_create, :auto_save
  end
end

因此,在您的模型中,您只需包含此模块,然后编写auto_save_dependencies :foo, :bar, ...

可能会更复杂,但我认为这是可行的