0

DataMapperクラスのメソッドを再利用しようとしています。これもルビーの質問かもしれません。

class Foo
  include DataMapper::Resource

  property :name
  property ...

  def self.special_name
    self.all(:name => 'whatever')
  end
end

class Bar
  include DataMapper::Resource

  property :name
  property ...

  def self.special_name
    self.all(:name => 'whatever')
  end
end

したがって、同じ結果を取得したいので、メソッドspecial_nameを両方のクラスに使用します。ただし、「all」などのDataMapperメソッドも使用します。では、これをどのように行いますか?

どうも

4

3 に答える 3

0


module SpecialName

property :name def self.special_name self.all(:name => 'whatever') end end

class Foo include DataMapper::Resource include SpecialName end

class Bar include DataMapper::Resource include SpecialName end

于 2010-03-10T18:15:38.033 に答える
0
module SpecialName
  def self.included(base)
    base.property :name, String
    base.extend ClassMethods
  end

  module ClassMethods
    def special_name
      all(:name => 'whatever')
    end
  end
end

class Foo
  include DataMapper::Resource
  include SpecialName
end

このinclude/extendイディオムの詳細については、http://railstips.org/blog/archives/2009/05/15/include-vs-extend-in-ruby/を参照してください。

于 2010-03-10T19:28:02.550 に答える
0

「答え」は間違っています。詳細については、この質問への回答を参照してください:カスタムメソッドを使用してDataMapper::Resourceを拡張する方法

短いバージョン:レコード/行とモデル/テーブルのクラスが異なるため、DataMapperの組み込みエクステンダーを使用する必要があります。

DataMapper::Model.append_extensions(MyModule::ClassMethods) #Add to model
DataMapper::Model.append_inclusions(MyModule::InstanceMethods) #Add to record
于 2011-04-16T09:22:56.390 に答える