2011-04-22 67 views
1

我有一個數據庫架構一樣,紅寶石DataMapper的不能保存到數據庫

DataMapper.setup :default, "sqlite://#{Dir.pwd}/image.db" 
class Image 
    include DataMapper::Resource 

    property :id  , Serial 
    property :url , String,unique: true 
    property :desc , String,unique: true,default: "empty" 
end 
DataMapper.finalize.auto_upgrade! 

然後,我有這樣的

links.each do |link| 
    puts link 
    if Image.all(:url=>link).empty? == true 
    img=Image.create(:url => link) 
    puts "Cannot save to database "if img.saved? == false 
    end 
end 

我想添加一個鏈接一個循環時,它已不在數據庫中。我運行該腳本,並始終得不到保存到dabase。我究竟做錯了什麼?謝謝你的幫助。 編輯:我添加到我的代碼

DataMapper::Logger.new($stdout, :debug) 

,也沒有插入查詢只選擇。

回答

3

您宣佈:遞減特性是唯一的,設定默認值「空」,並在你的代碼示例你創建圖像時未指定:desc,這會導致唯一性驗證失敗,這就是爲什麼您的圖像未保存。您可以從desc屬性聲明中刪除唯一選項,或者確保在創建圖像時爲desc提供唯一值。

此外,爲了使你的代碼更詳細的,所以你可以看到任何驗證錯誤試試這個:

links.each do |link| 
    image = Image.new(:url => link) 

    if image.save 
    puts "Image saved" 
    else 
    puts "Failed to save image: #{image.errors.inspect}" 
    end 
end 

請注意,使用你需要,要求「DM-驗證」寶石驗證錯誤。

+0

現在感謝您的幫助,它完美的工作 – John 2011-04-23 14:05:52

+0

您可以要求[Datamapper](http://datamapper.org/docs/create_and_destroy.html)在錯誤時引發異常:'Image.raise_on_save_failure = true' – 2012-01-11 06:40:38

0

你是什麼意思,你得到「無法保存到數據庫」?

你可以嘗試這樣的事情,看看它是否工作好一點。

links.each do |link| 
    if Image.first(:url => link) 
    p "image exists" 
    else 
    if Image.create(:url => link) 
     p "Image succesfully saved" 
    else 
     p "could not save image" 
    end 
    end 
end 
+0

當我的腳本完成時,數據庫仍然是空的。根據文檔「如果創建成功,#create將返回新​​創建的DataMapper :: Resource,如果失敗,它將返回一個使用給定屬性初始化的新資源,併爲該資源聲明​​可能的默認值,但這是還沒有保存,要想知道創建是否成功,你可以在返回的資源上調用#saved?,如果資源成功保存,它將返回true,否則返回false。這就是爲什麼我檢查保存?因爲我的數據庫仍然是空的 – John 2011-04-22 13:24:37