You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 15:54:55