Я, вероятно, что-то здесь упускаю (может пригодиться больше этих скучных подробностей), но если метрика существует, ее metric_input_file не следует обновлять, т. Е. Она устанавливается только при появлении новых. Если вы после обновления, то вы можете сделать
.first_or_create(msrun_id: tmp.id).update(metric_input_file: @metricsfile)
Или, если не ударить по базе данных дважды, то
m = Metric.first_or_new(msrun_id: tmp.id)
[set..save..assign]
Но если он не установлен на новых моделях , я не вижу, что вызвало бы это из кода, опубликованного до сих пор, больше ..?
[ОБНОВЛЕНО]
Исходя из вашего нового кода, я бы сказал, что это "классический случай" ложного сохранения DM. Я обычно добавляю следующую строку в раздел инициализации, например, application.rb в Rails.
DataMapper::Model.raise_on_save_failure = true
К сожалению, поднятое исключение никогда не говорит вам, почему (в аду есть специальное место для этого выбора, рядом с людьми, которые говорят в кинотеатрах.)
- немного неверное определение ассоциации
- имеет / принадлежит_, которое не "требуется: ложно" и не установлено
- помещая неправильный тип данных в поле, например строку в десятичное число
- проверка не пройдена
Если вы хотите опубликовать определения модели, проблема может быть обнаружена там.