0

私は DataMapper 1.2.0 を使用しており、データベースに保存するカスタム プロパティ タイプを定義しようとしています。これをどのように行うべきかを理解しようとしていますが、NoMethodError.

オブジェクトは ですがDog、このタイプは私が制御していない宝石からのものDataMapper::Property::Objectであるため、 から継承することはできません。そのため、カスタム プロパティ( ) となる新しいタイプを作成する必要があると思いますDatabaseDogドキュメントからの私の理解では、 2 つの方法が必要であるということです。

  • #load(value)データベースから文字列を取得し、Dogそれが表す
  • #dump(value)を受け取りDog、データベースに永続化される文字列を返します

エラーが発生し続けるという事実は、これを誤解していると思います。

このカスタム タイプを適切に作成するにはどうすればよいですか?

編集:ダンプ方法を少し変更したところ、文字列を受け取り続けていることがわかりました。#dump引数として文字列を受け取るのはなぜですか? Dog私が割り当てているオブジェクトを受け取るべきではありませんか?

test.rb

# The setup

require 'dm-core'
require 'dm-migrations'
require 'dm-sqlite-adapter'

class Dog
  attr_accessor :name
end

class DatabaseDog < DataMapper::Property::Text
  def load(value)
    d = Dog.new
    d.name = value
    d
  end

  def dump(value)
    puts "got here: #{value.inspect}"
    if value.nil?
      value
    else
      value.name
    end
  end
end

class User
  include DataMapper::Resource
  property :id, Serial, key: true
  property :pet, DatabaseDog
end

DataMapper.setup(:default, "sqlite3://#{File.join(Dir.pwd, "users.db")}")
DataMapper.finalize
DataMapper.auto_upgrade!


# Finally, the test

ein = Dog.new
ein.name = "Ein"

spike = User.create
spike.pet = ein

spike.save #=> NoMethodError

エラー

got here: nil
got here: "#<Dog:0x007fca399b7d40>"
./test.rb:19:in `dump': undefined method `name' for "#<Dog:0x007fba19960c00>":String (NoMethodError)
        from (...)/test/.bundle/gems/dm-core-1.2.0/lib/dm-core/property.rb:700:in `valid?'
        from (...)/test/.bundle/gems/dm-core-1.2.0/lib/dm-core/resource/persistence_state/dirty.rb:88:in `block in valid_attributes?'
        from (...)/test/.bundle/gems/dm-core-1.2.0/lib/dm-core/resource/persistence_state/dirty.rb:87:in `each_key'
        from (...)/test/.bundle/gems/dm-core-1.2.0/lib/dm-core/resource/persistence_state/dirty.rb:87:in `valid_attributes?'
        from (...)/test/.bundle/gems/dm-core-1.2.0/lib/dm-core/resource/persistence_state/dirty.rb:21:in `commit'
        from (...)/test/.bundle/gems/dm-core-1.2.0/lib/dm-core/resource.rb:956:in `_persist'
        from (...)/test/.bundle/gems/dm-core-1.2.0/lib/dm-core/resource.rb:987:in `block in update_with_hooks'
        from (...)/test/.bundle/gems/dm-core-1.2.0/lib/dm-core/resource.rb:984:in `catch'
        from (...)/test/.bundle/gems/dm-core-1.2.0/lib/dm-core/resource.rb:984:in `update_with_hooks'
        from (...)/test/.bundle/gems/dm-core-1.2.0/lib/dm-core/resource.rb:1021:in `save_self'
        from (...)/test/.bundle/gems/dm-core-1.2.0/lib/dm-core/resource.rb:1006:in `block in _save'
        from (...)/test/.bundle/gems/dm-core-1.2.0/lib/dm-core/resource.rb:1222:in `run_once'
        from (...)/test/.bundle/gems/dm-core-1.2.0/lib/dm-core/resource.rb:1005:in `_save'
        from (...)/test/.bundle/gems/dm-core-1.2.0/lib/dm-core/resource.rb:405:in `save'
        from ./test.rb:42:in `<main>'
4

1 に答える 1

0

ドキュメントによると、DatabaseDog は DataMapper::Property::Text ではなく DataMapper::Property::Object から継承する必要があります。

于 2013-04-17T13:45:28.480 に答える