Ruby on Rails,访问非持久属性和属性默认值

时间:2014-05-11 09:29:53

标签: ruby-on-rails ruby ruby-on-rails-4

我想用调查功能构建应用程序。要从用户那里收到答案,我已经添加了非持久属性 is_checked (我的架构中也有持久属性 is_right )。

class Answer < ActiveRecord::Base
  belongs_to :question
  attr_accessor :is_checked

  def initialize
    self.is_checked = false
  end

  after_initialize :default_values

  private

  def default_values
    self.is_right ||= false
  end
end

但是当我打开rails console并运行时:

Survey.first.questions.last.answers.last.attributes

没有 is_checked 属性。如果我在答案实例上调用 is_checked getter ,我会获得 nil

1 个答案:

答案 0 :(得分:3)

Imho您的initialize方法永远不会被调用,否则,因为您没有调用super,您将失去所有活动记录初始化。

您的initialize肯定与原始签名不匹配(它至少接受哈希),但after_initialize完全是出于这个原因而引入的。

所以我只想扩展default_values以包含设置is_checked

同样attr_accessor为实例变量创建访问方法,所以只需设置该实例变量。

所以我会写

class Answer < ActiveRecord::Base
  belongs_to :question
  attr_accessor :is_checked

  after_initialize :default_values

  private

  def default_values
    self.is_right ||= false
    @is_checked = false 
  end
end