2010-03-21 16 views
7

Sto provando a configurare il mio primo progetto Rails3 e, all'inizio, sto riscontrando problemi con uuidtools, il mio UUIDHelper o forse con i callback. Sto ovviamente cercando di usare gli UUID e (credo) ho impostato le cose come descritto in Ariejan de Vroom's article. Ho provato a utilizzare l'UUID come chiave primaria e anche semplicemente come campo supplementare, ma sembra che lo UUIDHelper non venga mai chiamato.UUID in Rails3

Ho letto molte citazioni di callback e/o helper che cambiano in Rails3, ma non riesco a trovare dettagli specifici che mi dicano come regolare. Ecco la mia messa a punto così com'è in questo momento (ci sono stati un paio di iterazioni):

# 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 

Tutta la comprensione sarebbe molto apprezzato.

Grazie.

risposta

4

Stai dichiarando un altro metodo before_create nel tuo modello di immagine? In tal caso, sostituirai quello nel modulo UUIDHelper. Dovrai dichiarare la callback in modo diverso o chiamare super nel callback nel tuo modello di immagine.

Edit: forse cambiare l'aiutante di simile a questa:

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

Questo è l'unico callback di qualsiasi tipo che viene eseguito al momento. Per ragioni di estensibilità, farò sicuramente una modifica una volta che avrò risolto e risolto il problema.Non mi ero reso conto che una callback in un helper sarebbe stata sovrascritta in quel modo, ma immagino che abbia senso. –

+0

Continuo a rimanere deluso dal fatto che Rails non offra nativamente il supporto UUID e Rails3 - almeno nel suo stato attuale - non sembra nemmeno supportare l'unico "hack" ragionevole che ho trovato. Ci sono alcune buone informazioni in questa risposta, quindi la contrassegnerò come la risposta a meno che/finché non arriva qualcosa di meglio. –

5

Se si ottiene un "NoMethodError (metodo non definito` timestamp_create' per UUID: Class)" Errore, quindi modificare il contenuto del set_uuid metodo per:

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

credo che ciò sia necessario per le versioni più recenti del uuidtools gemma.

1

Ho anche notato che manchi lo :id => false nel create_table. Controlla l'esempio dall'articolo di Ariejan un po 'più da vicino:

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

Inoltre, preferisco il UUIDTools::UUID.random_create.to_s alla versione timestamp. YMMV.

1

Ho dovuto specificare la chiave primaria nel mio modello per farlo funzionare a livello di controller.

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

    ... 

end 
1

ho delineare un esempio UUID lavorare in questa domanda:

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

Ovviamente si può riscrivere set_uuid qualsiasi modo si desidera - non c'è bisogno di utilizzare GUID pettine.

Crediti: adattato da https://github.com/boriscy/uuidrails3/blob/master/lib/uuid_helper.rb indicato in using UUID as primary key in rails and polymorph relationships. Anche trovato un esempio a https://github.com/belucid/Recent-Updates/blob/884624e433cdffd63abd24b3bdb516a5d1596173/lib/uuid_helper.rb.

0

È possibile evitare l'utilizzo di tipi di stringa per memorizzare l'UUID, poiché renderà le ricerche super-lente. C'è un 'activeuuid' gem che sembra promettente (usa l'archiviazione binaria).