相关疑难解决方法(0)

如何在ActiveRecord中设置默认值?

如何在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
Run Code Online (Sandbox Code Playgroud)

我已经看到以下示例谷歌搜索:

  def initialize 
    super
    self.status = ACTIVE unless self.status
  end
Run Code Online (Sandbox Code Playgroud)

  def after_initialize 
    return unless new_record?
    self.status = ACTIVE
  end
Run Code Online (Sandbox Code Playgroud)

我也看到人们把它放在他们的迁移中,但我宁愿看到它在模型代码中定义.

是否有规范方法为ActiveRecord模型中的字段设置默认值?

ruby-on-rails rails-activerecord

407
推荐指数
11
解决办法
18万
查看次数

如何在Rails activerecord模型中为属性创建默认值?

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

class Task < ActiveRecord::Base
  def status=(status)
    status = 'P'
    write_attribute(:status, status)
  end
end
Run Code Online (Sandbox Code Playgroud)

但是在创建时我仍然从数据库中检索此错误:

ActiveRecord::StatementInvalid: Mysql::Error: Column 'status' cannot be null
Run Code Online (Sandbox Code Playgroud)

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

在Rails中这样做的优雅方法是什么?

非常感谢.

activerecord ruby-on-rails

190
推荐指数
9
解决办法
19万
查看次数

如何在Rails 3中使用'after_initialize'?

UPDATE

我错误地检查了edgerails指南而不是当前正确的Rails 3指南(没有提到after_initialize).不确定为什么edgerails指南是"不正确的" - 我认为edgerails指南应该是最新的最新指南?

我要离开这个问题,以防万一有人来寻找同样的"问题".

宏观式呼叫after_initialize是要走的路.



应该after_initialize用作方法还是宏观式调用?

这有效,但给出了弃用警告:

def after_initialize
  logger.info "Called after_initialize"
end
Run Code Online (Sandbox Code Playgroud)

弃用警告:不推荐使用Base#after_initialize,请改用Base.after_initialize:方法.

这有效,并且没有警告:

after_initialize :do_this_after_initialize
def do_this_after_initialize
  logger.info "Called after_initialize"
end
Run Code Online (Sandbox Code Playgroud)

活动记录验证和回调指南10.4 after_initialize和after_find说:

...如果您尝试使用宏样式类方法注册after_initialize或after_find,它们将被忽略.此行为是由于性能原因,因为after_initialize和after_find都将为数据库中找到的每条记录调用,这大大减慢了查询...

那么这意味着宏方式的使用效率低于方法式方式?

(我指南错了,'cos代码为王:D)


另一个更新


一个提交这里从2011年1月28日表明,正确的方法是仍然使用宏风格的通话,而不是一个def after_initialize.

activerecord ruby-on-rails-3

18
推荐指数
1
解决办法
3万
查看次数