2013-02-20 5 views
1

빈입니다 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 속성이 비어있는 모든 행을 찾고 싶어요. 하지만이 스크립트를 실행하면 빈 출력이 나온다. 내가처럼 실행하면 : SQLite는 쉘이 쿼리를 실행

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

나에게 빈 year 열 7 개 행을 제공합니다 :

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

나는 올바른 출력을 얻을

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

무엇 내가 틀렸어?

+0

당신이 빈 문자열 검색을 해봤에 널 (null)을 해결하기 위해 중 하나입니까? ': year => '''또는 테이블에 실제 NULL 값이 포함되어 있습니까? 솔직히'': required => true' 필드에서 NULL을 얻는 것은 이상한 일입니다. – AlexQueue

+0

빈 문자열을 검색하는 것도 작동하지 않습니다. 전에 시도했습니다. 그리고 기능을 추가했기 때문에 응용 프로그램이 실행 된 후에이 필드를 추가했기 때문에 NULL 값을가집니다. 그리고이 코드는 데이터베이스를 마이그레이션하기로되어 있습니다. 따라서 아직 마이그레이션되지 않은 모든 행을 찾아야합니다. – Ps0ke

답변

1

문제의 근원 인 것처럼 들리는 음질이 좋지 않습니다. DataMapper는 DataMapper에 NULL 연도를 가진 행이 있어서는 안된다고 말했기 때문에 NULL 연도가있는 행이 없다고 생각합니다.

그러나 데이터베이스에는 여전히 데이터베이스가 있으므로 원시 SQL로 DatamMapper를 우회하면 결과가 반환됩니다.

이 솔루션은 (:required => false) DataMapper를 통해 널 (null)을 허용하거나 데이터베이스 (즉 UPDATE datasets SET year = '-1' WHERE year IS NULL)

+0

필자는 DataMapper가 필수 필드에서 작동한다는 것을 몰랐습니다. 지적 해 주셔서 고마워요. 나는 실제로'Dataset.all.each {| ds | ds.year.nil 아니라면? 다음 foobar 끝}'내 문제를 해결하기 위해. – Ps0ke

관련 문제