1

従来のMySQLデータベースを新しいDataMapperモデルにマッピングしようとしています。

MySQLスキーマ:

CREATE TABLE IF NOT EXISTS `backer` (
  `backer_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `secret` varchar(16) NOT NULL,
  `email` varchar(255) DEFAULT NULL,
  `status` enum('pending','ready') NOT NULL DEFAULT 'pending',  # relevant bit
  PRIMARY KEY (`backer_id`),
  UNIQUE KEY `backer_id` (`secret`),
  KEY `email` (`email`,`status`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=8166 ;

DataMapperモデル:

class Backer
  include DataMapper::Resource
  storage_names[:default] = "backer"     

  property :id,      Serial, :field => "backer_id"
  property :secret,  String, :field => "secret"
  property :email,   String, :field => "email"
  property :status,  Enum[ :pending, :ready ], :field => "status", :default => "pending"
  has n, :items, :child_key => "backer_id"
end

DataMapper.finalize

ほとんどの属性で、私は固執することができます:

b = Backer.first
b.first_name = "Daniel"
b.save!
# Backer.first.first_name == "Daniel"

それはうまく持続します。しかし、私がそれを行うときenum

b = Backer.first
b.status = :pending
b.save!

# b.status == :pending
# Backer.first.status != :pending
# Backer.first.update!(:status => :pending) ... 

フィールドの更新/保存はenumそれを保持していないようです。

SQLは通常、次のようになります。

1.9.3p327 :019 > Backer.last.update(:status => :ready)
 ~ (0.000349) SELECT `backer_id`, `secret`, `email`, `status` FROM `backer` ORDER BY `backer_id` DESC LIMIT 1
 ~ (0.000190) UPDATE `backer` SET `status` = 2 WHERE `backer_id` = 8166
 => true

しかし、オブジェクトを表示すると(たとえばBacker.last)、status変更されません。

アップデート

statusMySQLデータベースの列挙されたフィールドが永続化されていることを確認しました。ただし、statusDataMapperクラスの列挙されたプロパティは、これをまったく反映していません(常にnil)。

ここで何が起こっているのですか?

4

1 に答える 1

0

ありがとう@morbusg:それは1つの解決策です。

もう 1 つはEnum、最後に を aに変更することでした。これStringは、私の目的には問題なく機能しました。

于 2013-02-05T22:22:21.297 に答える