0

大量の依存関係を必要とするモデルがあります...次のようになります。

after_create :create_dependencies

def create_dependencies
  create_foo
  create_bar
  create_baz
  # ...
end

これは、私のモデルクラスをこのナンセンスの束で本当に汚染しています。これについて私ができる別の方法はありますか?フォームオブジェクトなどを使用したいのですが、コマンドラインやテストスイートなどで作成された場合でも、これらすべてのオブジェクトに依存関係があることを確認したいと思います.

4

2 に答える 2

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, ...

もっと複雑かもしれませんが、実行可能だと思います

于 2013-07-17T06:23:23.003 に答える
0

私の最初の反応は、あなたが言及したように Form オブジェクトを作成することでした ( Ryan Bates によって説明されているように)。ただし、モデルを直接保存すると、依存関係が作成されないことは間違いありません。

実行できるアプローチの 1 つは、依存関係の作成を別のクラスにリファクタリングすることです。

# 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
于 2013-07-17T03:53:02.547 に答える