修改
是否可以创建一个唯一的自动增量字段,该字段将在使用Rails创建和更新SQL时增加(类似于id字段,但在更新后增加并重新分配)?例如:
创建记录A(值:1)
创建记录B(值:2)
更新记录A(值:3)
更新记录B(值:4)
我正在尝试设置拉同步,并且需要一种方法来获取自上次同步以来创建或更新的所有记录。
我最初使用'created_at'和'updated_at'字段,但发现它们很难处理,部分同步有些不准确。
修改
我正在使用Postgresql和Sqlite作为我的数据库,因此希望存在一个适用于两个系统的解决方案。
修改
为了澄清,我想从客户端(最大的'sync'整数)向我的服务器传递一个整数,并在创建或更新该记录后获取创建或更新的所有记录。
答案 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)