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シェルでこのクエリを実行すると、空のyear列を持つ7行が表示されます。

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 に答える