如何在Ruby on Rails 3.1中设置模型的默认值?

6
在RoR 3.1中,"validates"仍然没有在模型中设置默认值的方法。或者说有吗?如果没有,那么设置默认值的最佳方式是什么?
4个回答

8
一种方法是在迁移中设置默认值。这将成为一个属性,将被设置到您的数据库中。您可以在此处阅读更多信息:http://api.rubyonrails.org/classes/ActiveRecord/Migration.html 另一种方法是设置一个before filter,比如before_save或before_create,然后检查属性上的值是否为nil,如果是,则将其设置为某个值。
class Abc
   before_save :set_default

   protected

   def set_default
     self.xyz = "default" unless self.xyz
   end
end

4
这里最好使用self.xyz ||= "default"吗? - Hopstream
3
如果您有一个布尔值,那么两者都不起作用。因为false.present?为false。在第二种情况下,即使将xyz设置为false,它也会被赋予一个值。在这种情况下,最好的选择是使用self.xyz.nil?。 - Wahaj Ali
3
迁移最适合设置默认值。 - Naveed
1
迁移对于默认值始终相同的情况最为适用,但是当你有动态默认值的情况,例如时区,activerecord 是你的选择。 - Alexis
小心 - 它可以防止对象被保存。最好的方法是从迁移开始。 - Guy Dubrovski
显示剩余3条评论

7
迁移最适合设置默认值。编写迁移以更新列并设置默认值。
        self.up do 
           update_column :table_name,:column_name,:default=>your default value
         end

1
很想看到一篇关于这个决定背后原因的博客文章链接。假设您只通过AR模型创建记录,将所有有关模型的信息(关联、验证和默认值)放在一个地方(即模型类)中会带来好处。 - odigity

7

这对我来说很有效

class WorkLogEntry < ActiveRecord::Base 

  after_initialize do
    self.work_done_on ||= Time.zone.today
  end

  ...
end

这是一个很好的例子,因为在涉及到时区的情况下,通常无法通过数据库直接为列设置默认值。您需要在模型层面上处理时区。注意:我还更新了您的答案,使用首选方法 Time.zone.today 获取今天的日期,该方法会考虑到时区。 - Joshua Pinter

0

当模型使用空字段参数获取表单参数时,该字段的参数将具有nil参数。因此,如果您初始化相同的@foo ='bar'并且用户发送带有空参数[:foo]的表单,则Model.create(params [:model])将具有foo => nil。

  1. 在创建对象之前,您可以检查所有参数
  2. 您可以通过迁移在数据库结构中设置默认参数:

    create_table:comments do |t|
    t.text:comment,:default =>'bar'
    end


如果我有一个字段在多个地方使用但只有时而设置(并且其他时间需要默认值),那似乎相当重复。我已经在模式中设置了默认值,但想知道Rails验证是否也支持在模型中添加数据完整性。 - Hopstream

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接