mongoid атомные обновления в рельсах - PullRequest
1 голос
/ 23 апреля 2011

У меня проблема с обновлением существующих ключевых полей составных документов в рельсах.связанный запрос монго для моего оператора update_attributes кажется правильным, однако впоследствии объект не может быть найден.

, например, с существующим объектом с именами first_name "Jane" и last_name "Doe" ... с my: keyбудучи :first_name, :last_name

я включил мой метод обновления:

{"artist"=>{"last_name"=>"Doe", "first_name"=>"John"}, "commit"=>"Update Artist", "id"=>"jane-doe"}

  def update
    @artist = Artist.find(params[:id])
    if @artist.update_attributes(params[:artist])
      redirect_to @artist
    end
  end

, который генерирует запрос монго: MONGODB app_database['artists'].update({"_id"=>"jane-doe"}, {"$set"=>{"_id"=>"john-doe", "first_name"=>"John"}})

что мне кажется правильным ... но когда я перенаправлен на нового художника, он жалуется на Document not found for class Artist with id(s) john-doe.

и, фактически, глядя на мою базу данных с консоли монго, я все еще вижу там Джейн Доу.Это как-то связано с тем, что они являются составными ключевыми полями, поскольку я могу очень просто обновлять неключевые поля.

что мне здесь не хватает?

1 Ответ

2 голосов
/ 23 апреля 2011

Я попробовал это в своем собственном приложении, и похоже, что MongoDB просто не позволяет вам в настоящее время изменять поле _id как часть операции $ set (что Mongoid использует для выполнения обновлений).Это странное ограничение - я уже полтора года пользуюсь Mongo и никогда не сталкивался с этим.

Итак, несколько вариантов:

  • Прекратите использовать для _id что-либо, что может потребоваться изменить позже.Я бы сделал это - в любом случае это лучшая практика.

  • Всякий раз, когда вам нужно внести одно из этих изменений _id, вместо этого создайте новую запись с новым атрибутом _id и удалите старую.,Однако это может привести к путанице, особенно если у вас есть другие модели, которые ссылаются на ваши модели Artist по идентификатору.

  • Подайте в 10gen сообщение о том, что это ограничение следует снять.Они очень хорошо реагируют на опасения пользователей, но даже если они согласятся, это, вероятно, займет некоторое время.

  • Подайте проблему в Mongoid, чтобы запросить поддержкуизменения такого типа (Mongoid может обработать механизм create + delete для вас), но, честно говоря, это тот тип крайнего случая, который, вероятно, не стоит дополнительного времени и кода для их поддержки.Было бы неплохо, если бы Mongoid выдал ошибку, когда вы попытались сделать подобное обновление, по крайней мере.

...