ActiveRecord after_initialize with select

当我尝试调用ActiveRecord方法时,我的两个Rails模型select它只返回错误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') 

有什么方法可以解决这个问题吗?

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

其中一个快速解决方案是在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 

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

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

希望这可以帮助。