用于创建和更新操作的Rails唯一订单字段

时间:2011-05-30 00:36:32

标签: sql ruby-on-rails ruby activerecord synchronization

修改

是否可以创建一个唯一的自动增量字段,该字段将在使用Rails创建和更新SQL时增加(类似于id字段,但在更新后增加并重新分配)?例如:

  

创建记录A(值:1)
  创建记录B(值:2)
  更新记录A(值:3)
  更新记录B(值:4)

我正在尝试设置拉同步,并且需要一种方法来获取自上次同步以来创建或更新的所有记录。

我最初使用'created_at'和'updated_at'字段,但发现它们很难处理,部分同步有些不准确。

修改

我正在使用Postgresql和Sqlite作为我的数据库,因此希望存在一个适用于两个系统的解决方案。

修改

为了澄清,我想从客户端(最大的'sync'整数)向我的服务器传递一个整数,并在创建或更新该记录后获取创建或更新的所有记录。

5 个答案:

答案 0 :(得分:1)

结束向我的模型添加sequence整数字段并设置以下迁移:

class CreateSequence < ActiveRecord::Migration
  def self.up
    begin
      execute "CREATE SEQUENCE sequence"
    rescue
    end
  end

  def self.down
    begin
      execute "DROP SEQUENCE sequence"
    rescue
    end
  end
end

然后,在我的模型中我添加了:

before_save do
  self.sequence = self.class.sequence
end

def self.sequence
  s ||= self.connection.select_value("SELECT nextval('sequence') ") rescue nil
  s ||= self.connection.select_value("SELECT strftime('%s','now')") rescue nil
  return 
end

注意:对于Sqlite序列不受支持,因此需要选择“epoch”形式的数据库。然而,这具有导致序列对于快速创建而言不是唯一的负面副作用。但是,就我而言,这不是问题。

答案 1 :(得分:0)

您可以使用before_save回调,如下所示:

class MyModel < ActiveRecord::Base
  before_save :increment

  ...

  protected

  def increment
    self.revision ||= 1
    self.revision += 1
  end
end

您可以通过定义和使用Callback Class来使其更具可重用性。

使用Gem /插件进行自动版本控制(从而维护version字段)的另一种选择。

答案 2 :(得分:0)

哎呀,没仔细读。

如果要获取自上次同步以来已修改的记录,可以创建一个布尔字段,以确定当前记录是否已同步。默认情况下将其设置为false,并在任何编辑时将其设置为false。这应该允许你只提取你需要的物品。

默认情况下会提供一个id属性,它会自动递增。默认情况下它是一个整数,但是如果你正在寻找一个guid,请告诉我,我可以为你指出一些好的资源。

就自上次同步以来提取记录而言,您可以在运行同步时获取最后一个ID,并在再次同步时将其用作起始值。

答案 3 :(得分:0)

所以...序列号与表格没有关联,对吧?

class SerialNumber < AR::Base
  has_many :thingies
  # just has an integer serial number field
end

class Thingie < AR::Base
  belongs_to :serial_number  # probably want to include this in default scope

  before_create :bump_serial
  before_save : bump_serial

private
  def bump_serial
    self.serial_number ||= 0
    self.serial_number += 1
  end
end

这似乎可以处理创建,新建/保存和更新的情况。但不要毁灭。

答案 4 :(得分:-2)

尝试使用act_as_versioned gem。 它为您可用于同步的每条记录设置版本字段。我认为这是跨客户端同步的更好方法,因为您可以比较服务器和客户端上的版本并同步服务器上更高的版本。

文档为here。 rubygem页面是here