我有一个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
可以消除这些错误,至少在我尝试的几次中是这样。虽然我想在某个时候理解为什么,但我错过了什么定期回电话&我做错了什么。