Ruby / DataMapper查找属性为空的行

时间:2013-02-20 23:26:56

标签: ruby sqlite datamapper

我有以下代码:

require 'data_mapper'

class Dataset
    include DataMapper::Resource

    property :id,        Serial
    property :name,      String,   :required => true
    property :year,      String,   :required => true

end

DataMapper.setup(:default, "sqlite://#{Dir.pwd}/database.db")
DataMapper.finalize.auto_upgrade!

Dataset.all(:year => nil).each do |dataset|
    puts dataset.inspect
    puts    
end

我希望找到year属性为空的所有行。但是当我运行这个脚本时,它会提供空输出。我运行它时:

Dataset.all(:year => "2005").each do |dataset|
    puts dataset.inspect
    puts    
end

我得到了正确的输出:

#<Dataset @id=178 @name="Supernatural" @year="2005">

在sqlite shell上运行此查询为我提供了7行,其中包含空year列:

sqlite> SELECT COUNT(`name`) FROM datasets WHERE `year` IS NULL;
COUNT(`name`)
-------------
7      

我做错了什么?

1 个答案:

答案 0 :(得分:1)

听起来问题的根源是移民不佳。 DataMapper认为没有NULL年的行,因为你告诉DataMapper不能有任何NULL年的行。

但是数据库仍然保留它们,因此绕过带有原始SQL的DatamMapper将产生它们。

解决方案是通过DataMapper(:required => false)允许NULL,或修复数据库中的NULL(即UPDATE datasets SET year = '-1' WHERE year IS NULL