我如何在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
and
def after_initialize
return unless new_record?
self.status = ACTIVE
end
我也见过有人把它放在迁移中,但我更愿意看到它在模型代码中定义。
是否有一个规范的方法来设置默认值的字段在ActiveRecord模型?
类似的问题,但背景略有不同:
-如何为Rails activerecord的模型中的属性创建默认值?
最佳回答:这取决于你想要什么!
如果你想让每个对象都以一个值开始:使用after_initialize:init
您希望new.html表单在打开页面时具有默认值?使用https://stackoverflow.com/a/5127684/1536309
class Person < ActiveRecord::Base
has_one :address
after_initialize :init
def init
self.number ||= 0.0 #will set the default value only if it's nil
self.address ||= build_address #let's you set a default association
end
...
end
如果你想让每个对象都有一个从用户输入中计算出来的值:使用before_save:default_values
你想让用户输入X然后Y = X+'foo'?使用:
class Task < ActiveRecord::Base
before_save :default_values
def default_values
self.status ||= 'P'
end
end
我遇到了问题after_initialize给出ActiveModel::MissingAttributeError错误时做复杂的发现:
eg:
@bottles = Bottle.includes(:supplier, :substance).where(search).order("suppliers.name ASC").paginate(:page => page_no)
where中的"search"是条件哈希值
所以我用这种方式重写了初始化:
def initialize
super
default_values
end
private
def default_values
self.date_received ||= Date.current
end
super调用是必要的,以确保在执行自定义代码(即:default_values)之前从ActiveRecord::Base正确初始化对象