Существует три основных варианта:
- Обновите все внутри MongoDB, чтобы включить выдержку.
- Используйте хук
after_initialize
для добавления выдержки по умолчанию к существующим объектам, когда вы извлекаете их из MongoDB.
- Запутайте вашу логику проверки, чтобы проверять только наличие выдержки на новых объектах.
(1) требуется (возможно большой) удар по времени, когда вы вносите изменение, но это всего лишь разовая вещь, и вам не нужно беспокоиться об этом после этого. Вы извлекаете каждую страницу из MongoDB, делаете page.excerpt = 'some default excerpt'
, а затем сохраняете ее обратно в MongoDB. Если у вас есть много страниц, вы хотите обрабатывать их, скажем, по 100 штук за раз. Если вы сделаете это, вы сможете искать отрывок, не беспокоясь о том, что вам следует делать с null
s. Вы также можете сделать это внутри MongoDB, отправив фрагмент JavaScript в MongoDB :
connection.eval(%q{
db.pages.find({}, { _id: true }).forEach(function(p) {
db.pages.update(
{ _id: p._id },
{ $set: { excerpt: 'some default excerpt' } }
);
});
})
(2) будет выглядеть примерно так:
after_initialize :add_default_excerpt, :unless => :new_record?
#...
private
def add_default_excerpt
self.excerpt = 'some default excerpt' unless self.excerpt.present?
end
Вы можете переместить unless self.excerpt
до :unless
, если не возражаете против использования лямбды:
after_initialize :add_default_excerpt, :unless => ->{ |o| o.new_record? || o.excerpt.present? }
#...
private
def add_default_excerpt
self.excerpt = 'some default excerpt'
end
Это должно быть довольно быстро и легко настроить, но есть и недостатки. Во-первых, у вас в MongoDB будет куча null
, которые вам, возможно, придется обрабатывать специально во время поисков. Кроме того, вы будете иметь при себе кучу кода и логики для работы со старыми данными, но этот багаж будет использоваться все реже и реже. Кроме того, after_initialize
звонки не приходят бесплатно.
(3) требует, чтобы вы пропустили проверку наличия выдержки для не новых страниц (:unless => :new_record?
) или вам нужно было бы найти какой-то способ отличить новые объекты от старых, а также правильно обрабатывать изменения обоих новых и старые страницы. Вы также можете заставить людей предоставить отрывок, когда они изменяют страницу и оставляют вашу проверку как есть; включая :default => ''
на вашем field :excerpt
, мы позаботимся о любых nil
проблемах в представлениях и тому подобное.
Я бы пошел с (1), если это возможно. Если обновление заняло бы слишком много времени и вы хотели, чтобы сайт работал и работал во время исправления MongoDB, вы можете добавить :default => ''
при обновлении, а затем удалить опцию :default
, перезапустить и вручную исправить все отклонения, которые были получены. через.