可以在创建或更新后自动重新加载实例



在我们的Rails 3.2.6应用程序中,我们有一个名为"version"的模型属性,每当创建或更新实例时(通过触发器),该属性都会在数据库级别递增。然而,在我们成功创建或更新之后,数据库设置的新值不会返回到我们的实例,除非我们显式地执行instance.reload.

有人知道在持久化到数据库后让活动记录自动重新加载实例的方法吗

背景

在我们的Rails 3.2.6应用程序中,我们有3个表,每个表都有一个"版本"列。在所有3个表中,每次插入和更新时都需要增加"version"整数列,并且"version"绝对不能重复。

简单的解决方案:我们在postgres中创建了一个版本序列,所有3个表都共享。我们有一个小触发器,它用nextval('version_equence')值更新这些表中任何记录的版本列:

  -- Resource Version Sequence
  CREATE SEQUENCE resource_versions_seq;

  -- Resource Version Trigger
  CREATE FUNCTION update_resource_version() RETURNS trigger AS $update_resource_version$
    BEGIN
      NEW.version := nextval('resource_versions_seq');
      RETURN NEW;
    END;
  $update_resource_version$ LANGUAGE plpgsql;

但是,当我们在active_record中创建、保存或更新_attributes时,在记录持久化后,不会重新加载新的"version"值。

使用after_save回调怎么样?在这个回调中,您可以只获取该字段,然后在模型上设置它。类似这样的东西:

class Thing < ActiveRecord::Base
  after_save :refresh_version
  def refresh_version
    self.version = Thing.find(self.id).select(:version)
  end
end

最新更新