我想通过在ActiveRecord中定义属性来创建属性的默认值.默认情况下,每次创建记录时,我都希望属性:status有一个默认值.我试着这么做:

class Task < ActiveRecord::Base
  def status=(status)
    status = 'P'
    write_attribute(:status, status)
  end
end

但在创建时,我仍然从数据库中检索到这个错误:

ActiveRecord::StatementInvalid: Mysql::Error: Column 'status' cannot be null

因此,我假定该值未应用于该属性.

在Rails中实现这一点的优雅方式是什么?

非常感谢.

推荐答案

可以为迁移中的列设置默认选项

....
add_column :status, :string, :default => "P"
....

你可以使用回调,before_save

class Task < ActiveRecord::Base
  before_save :default_values
  def default_values
    self.status ||= 'P' # note self.status = 'P' if self.status.nil? might be safer (per @frontendbeauty)
  end
end

Ruby-on-rails相关问答推荐

Rails:嵌套命名空间产生一个奇怪的部分路径,导致MissingTemplate错误

Rails HotWire和View Components:涡轮框架不会取代内容

使用turbo流的部分渲染在rails 7中不起作用.

RubyOnRail在测试环境中启动失败

CanCanCan、Pagy 和 Meil​​iSearch,如何组合这 3 个 gem?

升级到 Rails 6.1.6.1 导致 Psych::DisallowedClass: 试图加载未指定的类:符号

有没有一种简单的方法可以让 pow 为 https 服务?

Rails 将字符串与视图中的变量连接的最佳方法

在 Rails 中找不到关联问题

从 Authlogic 迁移到 Devise

RSpec 设置会话对象

在 Ruby on Rails 上,我们如何在控制器中打印调试信息?

Rails:在 lib 目录中记录代码?

如何编写 Capybara 断言来判断按钮的存在及其启用或禁用状态?

获取磁盘上 ActiveStorage 文件的路径

如何将 ActionMailer default_url_options 的 :host 动态设置为请求的主机名?

rails 单数资源还是复数?

Rails:带参数的 URL/路径

Post.all.map(&:id) 是什么意思?

默认情况下 haml