Как мне установить значение поля nil перед сохранением в mongoid? - PullRequest
0 голосов
/ 27 февраля 2012

У меня есть модель mongoid, скажем, Webpage, которая выглядит так:

class Webpage
  include Mongoid::Document

  field :short_link, type: String
  field :actual_link, type: String

  before_save :generate_short_link

  protected

  def generate_short_link
    short_link ||= rand(36**8).to_s(36)
  end
end

Но когда я делаю Webpage.create, short_link не заполняется автоматически. Что я делаю не так?

Ответы [ 3 ]

1 голос
/ 27 февраля 2012

Похоже, вам нужно заполнить short_link только при создании, и лучше использовать before_create callback.

class Webpage
  include Mongoid::Document

  field :short_link, type: String
  field :actual_link, type: String

  before_create :generate_short_link

  protected

  def generate_short_link
    self.short_link = rand(36**8).to_s(36)
  end
end
1 голос
/ 28 февраля 2012

Согласно Mongoid документация для Callbacks , он запускает только обратный вызов действия, которое вы выполняете. Вот почему это не стрельба. Вам нужно будет сделать, как ответил Волди, использовать обратный вызов before_create.

Однако, если это все, что вы делаете (ваш код не более сложный), тогда вместо установки short_link, если он еще не был назначен, вы можете просто установить его как значение по умолчанию, например:

class Webpage
  include Mongoid::Document

  field :short_link,  type: String,  default: -> { rand(36**8).to_s(36) }
  field :actual_link, type: String

end

Это будет вести себя так же, как ваш текущий код предназначен.

0 голосов
/ 27 февраля 2012

Я немного идиот, когда дело доходит до обратных вызовов, особенно когда это что-то вроде «обновления / установки поля перед сохранением объекта».Я обнаружил, что использование before_validation устраняет подобные ошибки, по крайней мере, несколько раз, которые я пытался.Хотя в какой-то момент я хотел бы понять, почему, что я пропускал при обычных обратных вызовах и что я делал неправильно.

...