Ruby on Rails中如何获取类创建时传递的实际属性
解决方案
在Rails模型中,要判断是否显式传入了某个属性(包括传入nil的情况),可以利用Active Record内部的@attributes.assigned?方法,它能准确追踪属性是否被显式赋值,无论值是否为nil。
修改你的set_done_at方法如下:
class Model1 belongs_to :something before_create :set_done_at private def set_done_at # 检查是否显式传入了done_at参数(包括nil) return if @attributes.assigned?(:done_at) self.done_at = Time.current end end
验证效果
- 未传入
done_at时:m1 = Model1.create(foo: "hi") m1.done_at # => 当前时间 - 传入非
nil的done_at时:m2 = Model1.create(done_at: Time.at(0)) m2.done_at # => 1970-01-01 00:00:00 - 传入
done_at: nil时:m3 = Model1.create(done_at: nil) m3.done_at # => nil
替代方案(Rails 6.1+)
如果你的Rails版本是6.1及以上,可以使用更直观的attribute_assigned?方法:
def set_done_at return if attribute_assigned?(:done_at) self.done_at = Time.current end
这个方案完全在模型内部实现,无需修改外部调用逻辑,同时覆盖所有场景需求。
内容的提问来源于stack exchange,提问作者Camilo
相关产品推荐
相关产品推荐

