Почему мои проверки DataMapper не работают?

Этот пример не подтверждает наличие заголовка для меня:

require 'rubygems'
require 'dm-core'
require 'dm-migrations'
require 'dm-validations'

db_name = 'rvtest.sqlite'

DataMapper::Logger.new($stdout, :debug)
DataMapper.setup(:default, 'sqlite://' + Dir.pwd + '/' + db_name)

class Task
  include DataMapper::Resource
  property :id,         Serial
  property :title,      String

  validates_presence_of :title
end

DataMapper.finalize
DataMapper.auto_upgrade!

Тем не менее, это делает:

require 'rubygems'
require 'dm-core'
require 'dm-migrations'
require 'dm-validations'

db_name = 'rvtest.sqlite'

DataMapper::Logger.new($stdout, :debug)
DataMapper.setup(:default, 'sqlite://' + Dir.pwd + '/' + db_name)

class Task
  include DataMapper::Resource
  property :id,         Serial
  property :title,      String, :required => true

end

DataMapper.finalize
DataMapper.auto_upgrade!

Почему они работают по-разному? Если я войду в irb, потребую этот файл и наберу Task.new.save!, первый вернет true, а второй false.


person lobati    schedule 05.11.2010    source источник


Ответы (1)


спасти! не вызывает никаких обратных вызовов, что означает, что он не вызывает проверки. попробуй с сохранением

person solnic    schedule 05.11.2010
comment
Хм, интересно. Значит ли это, что первый проверяет на уровне приложения, а второй устанавливает ограничения базы данных? В противном случае оба моих примера должны сохраниться в базе данных. - person lobati; 05.11.2010
comment
Да, точно. Ограничения БД устанавливаются на основе объявлений свойств, они также могут использоваться dm-валидациями для настройки автоматической проверки на уровне приложения, конечно. В вашем первом примере поле :title создается без параметра NOT NULL, поэтому вы сохраняете задачу с заголовком, установленным на nil. Вы получите ошибку проверки, если используете #save, используя #save! все обратные вызовы пропускаются, и, поскольку нет ограничений db, ресурс сохраняется. Во втором примере вы используете :required =› true, что приводит к тому, что поле базы данных заголовка имеет параметр NOT NULL, поэтому, даже если вы используете #save! задача не будет сохранена - person solnic; 08.11.2010