【问题标题】:ActiveRecord after_initialize with selectActiveRecord after_initialize with select
【发布时间】:2016-01-19 02:44:27
【问题描述】:

当我尝试调用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')

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

【问题讨论】:

  • 一切都取决于你的after_initialize 做什么。你介意分享一些代码吗?
  • @BroiSatse 我现在已将该代码放入问题中。谢谢。
  • 唯一想到的——你是否在该模型中定义了自己的初始化方法?
  • 嗨,托比,您的问题得到答案了吗?我面临同样的问题。请告诉我
  • @Toby1Kenobi 我有一个解决方案。但不确定你有什么错误。请让我知道错误。

标签: ruby-on-rails activerecord callback


【解决方案1】:

基本上,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

【讨论】:

  • 谢谢,这真的很有帮助。我正在寻找一个在初始化新对象后会运行的回调,但在从数据库中检索它时不会运行。这个答案提供了这一点。
  • 很高兴知道为什么会发生这个错误
  • @Toby1Kenobi 很高兴知道它有帮助
【解决方案2】:

我和你面临着类似的问题。

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

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2021-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-29
    • 2019-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多