2010-03-21 21 views
7

Estoy intentando configurar mi primer proyecto de Rails3 y, desde el principio, tengo problemas con uuidtools, mi UUIDHelper o quizás devoluciones de llamada. Obviamente trato de usar UUID y (creo) configuré las cosas como se describe en Ariejan de Vroom's article. Intenté usar el UUID como clave principal y también como un campo suplementario, pero parece que nunca se llama al UUIDHelper.UUID en Rails3

He leído muchas menciones de devoluciones de llamada y/o ayudantes que cambian en Rails3, pero no encuentro ningún detalle que me diga cómo ajustarme. Aquí está mi configuración tal y como está en este momento (ha habido unas pocas iteraciones):

# 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 

Cualquier penetración sería muy apreciado.

Gracias.

Respuesta

4

¿Está declarando otro método before_create en su modelo de imagen? De ser así, anulará el que está en el módulo UUIDHelper. Querrá declarar la devolución de llamada de otra manera o llamar a súper en la devolución de llamada en su modelo de imagen.

Editar: Puede cambiar el ayudante a ser algo como esto:

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

Esta es la única devolución de llamada de cualquier tipo que se está ejecutando en este momento. En aras de la extensibilidad, definitivamente haré un cambio una vez que obtenga este problema resuelto y solucionado.No me di cuenta de que una devolución de llamada en un ayudante sería sobrescrita de esa manera, pero creo que tiene sentido. –

+0

Continúo decepcionado de que Rails no ofrezca compatibilidad con UUID de forma nativa y Rails3, al menos en su estado actual, ni siquiera parece ser compatible con el único "truco" razonable que he encontrado. Hay buena información en esta respuesta, así que la voy a marcar como la respuesta a menos que/hasta que surja algo mejor. –

5

Si se produce un error "NoMethodError (método no definido` timestamp_create' de UUID: Clase)", a continuación, cambiar el contenido de la set_uuid método a:

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

creo que esto es necesario para las versiones más recientes de la gema uuidtools.

1

También noté que falta el :id => false en su create_table. Mira el ejemplo del artículo de Ariejan un poco más de cerca:

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

Además, prefiero el UUIDTools::UUID.random_create.to_s a la versión de marca de tiempo. YMMV.

1

Tuve que especificar la clave principal en mi modelo para que funcione en el nivel del controlador.

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

    ... 

end 
1

que esbozar un ejemplo UUID trabajando en esta pregunta:

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

Obviamente se puede reescribir set_uuid cualquier forma que desee - usted no tiene que utilizar GUID peine.

Créditos: adaptado de https://github.com/boriscy/uuidrails3/blob/master/lib/uuid_helper.rb al que se hace referencia en using UUID as primary key in rails and polymorph relationships. También se encontró un ejemplo en https://github.com/belucid/Recent-Updates/blob/884624e433cdffd63abd24b3bdb516a5d1596173/lib/uuid_helper.rb.

0

Considere evitar el uso de tipos de cadenas para almacenar su UUID, ya que hará que las búsquedas sean súper lentas. Hay un 'activeuuid' gem que parece prometedor (utiliza almacenamiento binario).