如何在mongoid中保存之前设置nil字段的值?

时间:2012-02-27 19:33:51

标签: ruby mongodb mongoid

我有一个mongoid模型,比如网页,就像这样:

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 个答案:

答案 0 :(得分:1)

您似乎只需要在创建时填充short_link,最好使用before_create回调。

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 :(得分:1)

根据Mongoid docs for Callbacks,它只会触发您正在执行的操作的回调。这就是它没有开火的原因。您需要按照Voldy的说法进行操作,使用before_create回调。

但是,如果这就是您正在做的所有事情(您的代码并不复杂),那么您可以将其设置为默认设置,而不是设置short_link,如下所示: / p>

class Webpage
  include Mongoid::Document

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

end

这与您当前的代码的行为相同。

答案 2 :(得分:0)

当谈到回调时,我有点像白痴,特别是当它像“在保存对象之前更新/设置字段”之类的东西时。我发现使用before_validation会让这些错误消失,至少我试过几次。虽然我想在某个时候理解为什么,我经常回调和错过了什么?我做错了什么。