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



我有一个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不会自动填充。我做错了什么?

似乎只需要在创建时填充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

根据回调的Mongoid文档,它只触发正在执行的操作的回调。这就是为什么它没有开火。你需要按照Voldy的回答,使用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

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

当涉及到回调时,我有点白痴,尤其是当它类似于"在保存对象之前更新/设置字段"时。我发现使用before_validation可以消除这些错误,至少在我尝试的几次中是这样。虽然我想在某个时候理解为什么,但我错过了什么定期回电话&我做错了什么。

最新更新