4

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

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

背景

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

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

  -- 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 中创建、保存或更新属性时,新的“版本”值不会在记录被持久化后重新加载。

4

1 回答 1

3

如何使用 after_save 回调?在此回调中,您可以仅获取该字段,然后将其设置在模型上。像这样的东西:

class Thing < ActiveRecord::Base
  after_save :refresh_version

  def refresh_version
    self.version = Thing.find(self.id).select(:version)
  end

end
于 2012-07-10T21:17:43.870 回答