ActiveRecord after_initialize with select

时间:2016-01-19 02:44:27

标签: ruby-on-rails activerecord callback

当我尝试调用ActiveRecord方法select时,我的两个Rails模型只返回错误object doesn't support #inspect

这些模型使用after_initialize回调,因此我怀疑它与此有关。

我正在使用after_initialize这样的回调:

enum state: [ :archived, :active ]

after_initialize :state_init
after_initialize :date_init

def state_init
  self.state ||= :active
end

def date_init
  self.report_date ||= self.event ? self.event.event_date : Date.current
end

我需要使用select方法选择按月分组的记录,其中包含一个日期为Postgres的字段

ModelName.select("date_trunc( 'month', report_date ) as month, count(*) as count").group('month')

有没有办法解决这个问题?

2 个答案:

答案 0 :(得分:1)

基本上,after_initialize方法的问题是当你只选择模型的列子集时,如果你的after_initialize方法/块访问了一个未包含在select子句中的列,你将得到一个MissingAttributeError。 / p>

其中一个快速解决方案就是在select子句中包含这些列。但由于这不是正确的解决方案。你可以通过告诉进程在没有持久化记录的情况下初始化它来修复它,如下所示:

after_initialize :state_init, unless: :persisted?
after_initialize :date_init, unless: :persisted?

def state_init
  self.state ||= :active
end

def date_init
  self.report_date ||= self.event ? self.event.event_date : Date.current
end

答案 1 :(得分:0)

我正面临与你类似的问题。

最后,我决定删除 after_initialize 方法,并在db(migration)中设置默认值。

希望这有帮助。