1

我有以下代码:

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      

我究竟做错了什么?

4

1 回答 1

1

听起来问题的根源是糟糕的迁移。DataMapper 认为没有年份为 NULL 的行,因为您告诉 DataMapper 不可能有任何年份为 NULL 的行。

但是数据库仍然保存它们,因此使用原始 SQL 绕过 DatamMapper 将产生它们。

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

于 2013-02-21T19:11:22.167 回答