2010-03-21 8 views
7

Ich versuche, mein erstes Rails3-Projekt einzurichten, und schon früh stoße ich auf Probleme mit uuidtools, meine UUIDHelper oder vielleicht Callbacks. Ich versuche natürlich, UUIDs zu verwenden und (denke ich) habe ich Dinge eingerichtet, wie in Ariejan de Vroom's article beschrieben. Ich habe versucht, die UUID als Primärschlüssel und auch einfach als ein zusätzliches Feld zu verwenden, aber es scheint, als ob die UUIDHelper nie aufgerufen wird.UUIDs in Rails3

Ich habe viele Erwähnungen von Callbacks und/oder Helfern in Rails3 geändert, aber ich kann keine Details finden, die mir sagen würden, wie man sich anpasst. Hier ist mein Setup, wie es in diesem Moment steht (es gab ein paar Iterationen):

# migration 
class CreateImages < ActiveRecord::Migration 
    def self.up 
    create_table :images do |t| 
     t.string :uuid, :limit => 36 
     t.string :title 
     t.text :description 

     t.timestamps 
    end 
    end 
    ... 
end 

# lib/uuid_helper.rb 
require 'rubygems' 
require 'uuidtools' 

module UUIDHelper 
    def before_create() 
    self.uuid = UUID.timestamp_create.to_s 
    end 
end 

# models/image.rb 
class Image < ActiveRecord::Base 
    include UUIDHelper 

    ... 
end 

Jeder Einblick würde sehr geschätzt werden.

Danke.

Antwort

4

Sie deklarieren eine andere before_create-Methode in Ihrem Image-Modell? Wenn dies der Fall ist, überschreiben Sie die im UUIDHelper-Modul. Sie möchten den Callback entweder anders deklarieren oder im Callback in Ihrem Image-Modell super aufrufen.

Edit: Vielleicht die Helfer ändern etwas wie folgt aussehen:

module UUIDHelper 
    def self.included(base) 
    base.class_eval do 
     before_create :set_uuid 

     def set_uuid 
     self.uuid = UUID.timestamp_create.to_s 
     end 
    end 
    end 
end 
+0

Dies ist der einzige Callback, der gerade ausgeführt wird. Aus Gründen der Erweiterbarkeit werde ich definitiv eine Änderung vornehmen, sobald ich dieses Problem erkannt und behoben habe.Ich wusste nicht, dass ein Rückruf in einem Helfer auf diese Weise überschrieben würde, aber ich denke, es macht Sinn. –

+0

Ich bin weiterhin enttäuscht, dass Rails keine UUID-Unterstützung nativ bietet und Rails3 - zumindest in seinem aktuellen Zustand - nicht einmal den einzig vernünftigen "Hack" unterstützt, den ich gefunden habe. Es gibt einige gute Informationen in dieser Antwort, also werde ich es als die Antwort markieren, es sei denn/bis etwas Besseres kommt. –

5

Wenn Sie einen Fehler "NoMethodError (nicht definierte Methode` timestamp_create‘für UUID: Class)" erhalten, dann den Inhalt des set_uuid ändern Methode:

self.uuid = UUIDTools::UUID.timestamp_create().to_s

ich glaube, das für neuere Versionen des uuidtools gem notwendig ist.

1

Ich bemerkte auch, dass Sie die :id => false in Ihrem create_table vermissen. Überprüfen Sie das Beispiel aus Ariejan den Artikel aus etwas genauer:

create_table :posts, :id => false do |t| 
    t.string :uuid, :limit => 36, :primary => true 
end 

Außerdem ziehe ich den UUIDTools::UUID.random_create.to_s auf die Zeitstempel-Version. YMMV.

1

Ich musste den Primärschlüssel in meinem Modell angeben, damit es auf Controller-Ebene funktioniert.

class Image < ActiveRecord::Base 
    include UUIDHelper 
    set_primary_key :uuid 

    ... 

end 
1

ich umreißen ein Arbeits UUID Beispiel in dieser Frage:

Is COMB GUID a good idea with Rails 3.1 if I use GUIDs for primary keys?

Offensichtlich Sie set_uuid jede mögliche Weise umschreiben können Sie wollen - Sie müssen nicht COMB GUIDs verwenden.

Credits: angepasst von https://github.com/boriscy/uuidrails3/blob/master/lib/uuid_helper.rb verwiesen in using UUID as primary key in rails and polymorph relationships. Auch gefunden ein Beispiel bei https://github.com/belucid/Recent-Updates/blob/884624e433cdffd63abd24b3bdb516a5d1596173/lib/uuid_helper.rb.

0

Sie könnten die Verwendung von Zeichenfolientypen zur Speicherung Ihrer UUID vermeiden, da dies die Suche sehr langsam macht. Es gibt eine 'activeuuid' gem, die vielversprechend aussieht (verwendet binären Speicher).