【发布时间】:2010-09-24 14:51:25
【问题描述】:
如何在 ActiveRecord 中设置默认值?
我看到 Pratik 的一篇文章描述了一段丑陋而复杂的代码:http://m.onkey.org/2007/7/24/how-to-set-default-values-in-your-model
class Item < ActiveRecord::Base
def initialize_with_defaults(attrs = nil, &block)
initialize_without_defaults(attrs) do
setter = lambda { |key, value| self.send("#{key.to_s}=", value) unless
!attrs.nil? && attrs.keys.map(&:to_s).include?(key.to_s) }
setter.call('scheduler_type', 'hotseat')
yield self if block_given?
end
end
alias_method_chain :initialize, :defaults
end
我在谷歌上看到了以下示例:
def initialize
super
self.status = ACTIVE unless self.status
end
和
def after_initialize
return unless new_record?
self.status = ACTIVE
end
我也看到人们将它放在他们的迁移中,但我宁愿看到它在模型代码中定义。
是否有规范的方法可以为 ActiveRecord 模型中的字段设置默认值?
【问题讨论】:
-
看起来你自己回答了这个问题,有两种不同的变体:)
-
请注意,'self.status = ACTIVE 的“标准”Ruby 习语,除非 self.status' 是 'self.status ||= ACTIVE'
-
Jeff Perrin 的回答比目前标记为接受的要好得多。 default_scope 是设置默认值的不可接受的解决方案,因为它具有改变查询行为的巨大副作用。
-
鉴于对这个问题的所有支持,我会说 Ruby 需要一个 setDefaultValue 方法用于 ActiveRecord
标签: ruby-on-rails rails-activerecord