3

クラスの再定義をテストするレンガの壁にぶつかっていますが、それにアプローチする方法がわかりません。私がテストしているシナリオは次のとおりです (これは Core Data ではありません)。

  • アプリケーションはバージョン 1 のモデルで実行されます
  • 熱心なプログラマーは、列を追加/削除/再定義してモデルを変更します
  • アプリケーションはバージョン 2 のモデルで実行されます

私が問題に直面しているのは、メモリからのアプリケーションの実際の削除と、最初からの再構築をシミュレートすることです。モジュールがインクルードされると、多くのモデル固有の設定が行われ、MotionModel::Modelモジュールがクラスにインクルードされるときに一度だけ行われるため、これは重要です。これが私がうまくいくと感じたものです:

  it "column removal" do
      class Removeable
        include MotionModel::Model
        columns       :name => :string, :desc => :string
      end


      @foo = Removeable.create(:name=> 'Bob', :desc => 'who cares anyway?')


      Removeable.serialize_to_file('test.dat')

      @foo.should.respond_to :desc

      Object.send(:remove_const, :Removeable)  # Should remove all traces of Removeable
      class Removeable
        include MotionModel::model             # Should include this again instead
        columns       :name => :string,        # of just reopening the old Removeable
                      :address => :string      # class
      end


      Removeable.deserialize_from_file # Deserialize old data into new model


      Removeable.length.should == 1
      @bar = Removeable.first
      @bar.should.respond_to :name
      @bar.should.respond_to :address      
      @bar.should.not.respond_to :desc


      @bar.name.should == 'Bob'
      @bar.address.should == nil
    end
  end

残念ながら、Object.send(:remove_const, :Removeable)私が望んでいたことはしません。Rubyは、モジュールのメソッドを再度開いRemoveableても実行できないと考えているだけです。self.included()MotionModel::Model

仕様例のコンテキストで、このクラスの作成をゼロからエミュレートする方法に関するアイデアはありますか?

4

1 に答える 1

3

匿名クラスで作業してみます (MotionModel にテーブル名を伝える必要があります)。

架空の例:

model_before_update = Class.new do
  # This tells MotionModel the name of the class (don't know if that actually exists)
  table_name "SomeTable"
  include MotionModel::Model
  columns       :name => :string, :desc => :string
end

クラスをまったく削除せず、同じテーブル名で別の (匿名) クラスを定義するだけです。

model_after_update = Class.new do
  table_name "SomeTable"
  include MotionModel::model
  columns       :name => :string,
                :address => :string
end

そういえば、上記のようなtable_nameセッターがあれば、RubyMotionで動かない場合でも無名クラスを使う必要はありません。

于 2012-12-03T16:30:25.963 に答える