【问题标题】:Automatically setting a column to created_at during model instance creation在模型实例创建期间自动将列设置为 created_at
【发布时间】:2012-08-07 17:16:58
【问题描述】:

我有以下模型(sort_timestamp 是日期时间):

class Post < ActiveRecord::Base
  [snip attr_accessible]
  acts_as_nested_set
  after_create :set_sort_timestamp

  private
  def set_sort_timestamp
    self.sort_timestamp = self.created_at
  end
end

我正在使用 https://github.com/collectiveidea/awesome_nested_set 。此代码未设置sort_timestamp。我做错了什么?

【问题讨论】:

    标签: ruby-on-rails ruby activerecord callback


    【解决方案1】:

    除非我错过了您在这里所做的事情的重点,否则您可能正在寻找 before_create,如果您希望在创建行时保存它。否则,您必须将self.save 添加到方法中,但这会导致额外的数据库调用,因此before_create 可能是更好的选择。

    (基本上,您之前所做的流程是创建模型,将其保存到数据库中,然后对象将其属性sort_timestamp 修改为created_at;这是在您的数据库提交之后, 并且只在内存中执行(所以不会持久化,除非你在后面的代码中以另一种方式持久化它)。

    编辑:实际上,这可能行不通,因为 created_at 可能不会在创建记录之前设置。几个选项:

    1) 使用 after_createself.save 添加到方法的末尾 2) 如果时间 sort_timestampcreated_at 不必完全相同,请使用 Time.now。 或者,3) 尝试为迁移添加默认值:How to use created_at value as default in Rails

    【讨论】:

    • after_ 更改为before_create 没有任何作用。
    • 再想一想, before_create 可能导致 created_at 为零(因为它尚未创建)。如果适合您的原因,您可以尝试 stackoverflow.com/questions/9087494/… 或以其他方式使用 Time.now()。
    • 请记住,Time.now() 可能与 created_at 不同 - 如果这很重要,那么您将不得不使用不同的解决方案。祝你好运! :)
    • 对于实用目的来说已经足够接近了。
    • 可能会完全不同
    猜你喜欢
    • 2015-11-11
    • 2023-03-23
    • 2018-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-11
    • 1970-01-01
    • 2015-05-31
    相关资源
    最近更新 更多