DataMapper first_or_create не работает ... есть идеи, почему? - PullRequest
0 голосов
/ 07 июля 2011

Ну, я наконец решил, что я не сумасшедший.Итак, это оставляет DataMapper.

Вот что я делаю.У меня есть модель Msrun, которая has 1 Метрика.

tmp = Msrun.first_or_create # I'll skip the boring details
tmp.metric = Metric.first_or_create( {msrun_id: tmp.id}, {metric_input_file: @metricsfile} )
p tmp.metric # => #<Metric @metric_input_file=nil @msrun_id=1>
tmp.metric.metric_input_file = @metricsfile
p tmp.metric # => #<Metric @metric_input_file=#<Pathname:/home/ryanmt/Dropbox/coding/rails/metrics_site/spec/tfiles/single_metric.txt> @msrun_id=1>

Итак, почему это не работает?Я читаю http://datamapper.org/docs/create_and_destroy и делаю то, что показывает, работает.Это было ужасно сложно.Спасибо за любую помощьfirst_or_create не только не дает ожидаемого поведения при чтении источника

def first_or_create(conditions = {}, attributes = {})
  first(conditions) || create(conditions.merge(attributes))
end

, но и не создает.

Ответы [ 2 ]

3 голосов
/ 07 июля 2011

Я, вероятно, что-то здесь упускаю (может пригодиться больше этих скучных подробностей), но если метрика существует, ее 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

К сожалению, поднятое исключение никогда не говорит вам, почему (в аду есть специальное место для этого выбора, рядом с людьми, которые говорят в кинотеатрах.)

  • немного неверное определение ассоциации
  • имеет / принадлежит_, которое не "требуется: ложно" и не установлено
  • помещая неправильный тип данных в поле, например строку в десятичное число
  • проверка не пройдена

Если вы хотите опубликовать определения модели, проблема может быть обнаружена там.

0 голосов
/ 04 января 2012

В дополнение к ответу выше, я видел этот вызов die (например, буквальное прекращение всего выполнения) без ошибок, когда я выполнял find_or_create, который создал бы объект, нарушающий ограничение первичного ключа.Это связано с тем, что модель datamapper не синхронизировалась с реальной схемой базы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...