Восстановить ключи в Mongoid? - PullRequest
       18

Восстановить ключи в Mongoid?

0 голосов
/ 21 декабря 2011

Просто пробуя Mongoid в данный момент, я столкнулся с проблемой, которая, вероятно, довольно проста, но я в растерянности:

У меня действительно простая модель статьи:

class Article
  include Mongoid::Document
  field :title, :type => String
  field :content, :type => String

  key :title

  referenced_in :subject

  validates_presence_of :title
end

Я добавил key :title после того, как уже создал одну тестовую запись.Вновь созданные записи работают, как и ожидалось, но первая статья (которая изначально имела обычный идентификатор объекта mongoid) ведет себя странно:

В представлениях rails эта первая статья по-прежнему возвращает свой идентификатор объекта вместо нового ключа.т. е. использование link_to article.name, article возвращает:

<a href="/articles/4ef150970a68b38415000003">Show</a>

... когда все остальные возвращают параметризованные ключи, например:

<a href="/articles/other-article">Show</a>

Если я нажимаю эту ссылку, я получаю "Запись не найдена».Я попытался загрузить и сохранить эту запись в консоли, и после этого вызова article.id для этой записи вернул параметризованный ключ, но он все еще показывает старый способ в представлении и не работает.

Итак, пара вопросов:

  1. Что здесь происходит?
  2. Как это исправить?
  3. Эта ситуация показывает мне, что если вы установите поле наключом является модель mongoid, вы должны быть действительно уверенными, что она никогда не изменится.Как вы справляетесь с чем-то вроде использования названия статьи в качестве пули, тогда, когда они могут иногда нуждаться в изменении?

Спасибо!

1 Ответ

0 голосов
/ 21 декабря 2011

Что ж, поскольку _id является неизменным, единственным вариантом является повторная вставка этого документа с новым «медленным» идентификатором и удаление старого.

И да, формат _id и ключ шарда (если вы используете шардинг) - это две вещи, которые вам лучше иметь с самого начала :-) Все остальное можно относительно легко исправить.

...