2013-02-05 3 views
1

새로운 DataMapper 모델로 기존 MySQL 데이터베이스를 매핑하려고합니다.DataMapper enum 필드가 저장되거나 업데이트 될 때 유지되지 않습니다.

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은 변경되지 않습니다.

UPDATE는

나는 MySQL 데이터베이스에 열거 status 필드가 지속되고 있음을 확인했습니다. 그러나 DataMapper 클래스의 열거 된 status 속성은이 값을 전혀 반영하지 않습니다 (항상 nil).

여기가 어떻게됩니까?

+0

'b.reload가 도움이됩니까? – morbusg

+1

아, 기다리지 마라. DataMapper 'Enum'은 'Integer'로 유지되는 반면, MySQL 'enum'은 문자열이다. 그래서 당신은 아마도'DataMapper :: Property :: Enum'을 패치하여 MySQL'enum'을 지원해야 할 것입니다. – morbusg

답변

0

감사합니다. @morbusg : 해결책 중 하나입니다.

다른 하나는 String으로 끝나고 Enum을 바꿔서 내 용도로 잘 작동합니다.