2013-03-28 32 views
1

的屬性我開始使用Ruby和DataMapper,並且偶然發現了一個我認爲沒有任何意義的問題。比方說,我有以下型號:DataMapper沒有看到分配給@

class Foo 
    include DataMapper::Resource 

    property :id, Serial 
    property :date, Date, required: true 

    def initialize 
    @date = Date.today 
    end 
end 

我打開了IRB來測試我的模型,建立數據庫連接,並嘗試保存新富:

> foo = Foo.new 
> foo.date 
=> #<Date: 2013-03-28 ((2456380j,0s,0n),+0s,2299161j)> 
> foo.save 

然後我得到以下例外:

DataObjects::IntegrityError: foos.date may not be NULL

而且,這是完全有道理的,因爲我根據需要標記了日期。但日期在那裏!我在類的構造函數中分配它!如果我沒有用今天的日期初始化它,並且試圖保存,我只會得到一個驗證錯誤。沒有例外。

什麼我不明白(這就是我要你回答)是,如果我取代

@date = Date.today 

self.date = Date.today 

它的作品! foo被正確保存。這是爲什麼?它是DataMapper內部的錯誤嗎?

+0

這意味着DataMapper會保留某種內部設置/未設置的數據結構,只有在使用setter/getters而不是基礎變量時纔會操作DataSetper。 – Linuxios

+0

@Linuxios:有沒有辦法讓它工作的邏輯方式?它目前的工作方式非常直觀。 –

+1

完全按照你所說的使用'self.date'。實例變量是類的最內部部分 - 如果使用它們與DataMapper的內部進行交互,則會導致火災。 – Linuxios

回答

1

在提出DataMapper人員的問題後,我被告知這是設計。要使髒跟蹤工作,您必須絕對使用屬性編寫器,而不是直接設置實例變量。