Verwenden einer nicht-integer-ID-Spalte in ActiveRecord

Gibt es irgendwelche gotchas, um eine Nicht-Integer-Spalte für die ID in einem ActiveRecord-model zu verwenden? Wir werden mit replizierten databaseen, mit Kopien einer Rails App schreiben, um diese databaseen in verschiedenen Rechenzentren zu verwenden. Ich mache mir Sorgen, dass wir mit normalen IDs Kollisionen zwischen neu erstellten Zeilen in verschiedenen Rechenzentren bekommen.

Unser DBA hat vorgeschlagen, die Identitätsspalten mit verschiedenen Startpunkten für jede der verschiedenen databaseen / Rechenzentren zu initialisieren, aber im Laufe der time werden diese schließlich überlappen und am Ende kollidieren (die besondere Tabelle, die ich mir Sorgen machen wird, wird sehr stark verkehrt) . Ich bin mir sicher, dass es für eine Weile gut funktionieren würde, aber ich möchte nicht derjenige sein, der debug ist, was falsch ist, wenn die Dinge anfangen, wonky 2 Jahre auf der Straße zu gehen.

Ich möchte nur die ID-Spalten mit GUIDs replace. Die database kann sie transparent erzeugen, so wie die id normalerweise generiert wird. MS garantiert, dass sie nicht zwischen unseren verschiedenen databaseen kollidieren. Der Nachteil dort ist, dass ich muss sicherstellen, dass Rails nicht zu Barf auf id Spalten, die nicht ganze Zahlen sind.

Hat jemand so etwas versucht? Wie viel von der ActiveRecord Sanitär mussten Sie ändern?

Nur ein pointers

create_table :blah, {:id => false} do |t| t.string :my_string_id end execute "ALTER TABLE blah ADD PRIMARY KEY (my_string_id);" 

Installiere uuidtools

definiere helpers / uuid_helper.rb

 require 'rubygems' require 'uuidtools' module UUIDHelper def before_create() self.id = UUID.timestamp_create().to_s end end 

und füge es in deinem model ein

 class Model < ActiveRecord::Base include UUIDHelper # ........ end 

Wenn es ein Problem ist, etwas anderes als die Voreinstellung für Rails ID zu verwenden (was ich nicht weiß), wäre eine andere Möglichkeit, nur die Standard-Auto-Inkrement-Integer-ID für allgemeine Rails-Nutzung in deiner lokalen App zu behalten, aber auch habe ein GUID-Feld, das du verwenden würdest, wenn du Multi-database-Sachen machen willst. Wenn du also eine Einfügung von einem DB zum nächsten machst, würdest du die GUID angeben und den anderen DB ein eigenes Auto-Inkrement erzeugen lassen.