только что начал изучать DataMapper для Ruby ORM, я столкнулся с проблемой, которая не дает мне покоя.
Поведение по умолчанию при сохранении экземпляров в DataMapper (через DataMapper :: Resource.save ), насколько я понимаю, при сбое молча, возвращать false из метода сохранения и собирать любыеошибки в сборе ошибок.Пока все хорошо, это работает, как ожидалось.Проблема, с которой я сталкиваюсь, связана с естественными первичными ключами, где установка дубликатов выдаст исключение вместо того, чтобы молча возвращать false из метода сохранения, явно игнорируя текущую настройку rise_on_save_failure .Рассмотрим следующий фрагмент:
require 'data_mapper'
class Thing
include DataMapper::Resource
property :name , String, :key=> true
property :description, String, length: 2..5
end
DataMapper.setup :default, "sqlite:memory"
DataMapper.finalize
DataMapper.auto_migrate!
#Create a thing and have it properly silently fail saving
t1=Thing.new(:name=>"n1",:description=>"verylongdescription" )
t1.save #ok
puts("t1 is saved:"+t1.saved?.to_s)
t1.errors.each do |e|
puts e
end
#Create two things with the same key, and fail miserably in silently failing the second save...
t1=Thing.new(:name=>"n1",:description=>"ok" )
t2=Thing.new(:name=>"n1",:description=>"ok" )
t1.save #ok
t2.save #not ok, raises Exception event though it shouldn't?
puts("t2 is saved:"+t1.saved?.to_s)
t2.errors.each do |e|
puts e
end
Первое сохранение при экземпляре, не прошедшем проверку правилом для свойства: description, ведет себя как ожидалось.Третье сохранение экземпляра с дублирующимися ключами, однако, этого не делает, поскольку оно вызывает исключение, а не просто возвращает false.
Почему это?Очевидно, что можно обойти, но это не очень понятно.Является ли случай, когда поведение без вывода сообщений будет применяться только к ошибкам проверки в слое DataMapper, и любые серьезные ошибки из базового хранилища данных будут распространяться как исключения для вызывающей стороны?
Спасибо!