UUID в Rails3 - PullRequest
       26

UUID в Rails3

7 голосов
/ 21 марта 2010

Я пытаюсь настроить свой первый проект на Rails3 и вначале у меня возникают проблемы с uuidtools, моим UUIDHelper или, возможно, обратными вызовами. Я, очевидно, пытаюсь использовать UUID, и (я думаю) я настроил все так, как описано в статье Ариян де Врум . Я пытался использовать UUID в качестве первичного ключа, а также просто в качестве дополнительного поля, но кажется, что UUIDHelper никогда не вызывается.

Я прочитал много упоминаний об обратных вызовах и / или помощниках, изменяющихся в Rails3, но я не могу найти какие-либо подробности, которые бы указывали мне, как настроить. Вот моя установка в том виде, как она есть в данный момент (было несколько итераций):

# 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

Любое понимание будет высоко ценится.

Спасибо.

Ответы [ 6 ]

5 голосов
/ 06 апреля 2010

Если вы получаете сообщение об ошибке «NoMethodError (неопределенный метод` timestamp_create 'для UUID: Class) ", измените содержимое метода set_uuid на:

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

Я считаю, что это необходимо для более поздних версий гема uuidtools.

4 голосов
/ 21 марта 2010

Вы объявляете другой метод before_create в вашей модели Image? Если это так, вы будете переопределять один в модуле UUIDHelper. Вы можете либо объявить обратный вызов другим способом, либо вызвать super в обратном вызове в вашей модели изображения.

Редактировать: Возможно, измените помощника, чтобы он выглядел примерно так:

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
1 голос
/ 08 июня 2012

Я набросал рабочий пример UUID в этом вопросе:

Является ли COMB GUID хорошей идеей с Rails 3.1, если я использую GUID для первичных ключей?

Очевидно, что вы можете переписать set_uuid любым способом - вам не нужно использовать COMB GUID.

Кредиты: адаптировано с https://github.com/boriscy/uuidrails3/blob/master/lib/uuid_helper.rb ссылка на с использованием UUID в качестве первичного ключа в рельсах и полиморфных отношениях . Также нашел пример на https://github.com/belucid/Recent-Updates/blob/884624e433cdffd63abd24b3bdb516a5d1596173/lib/uuid_helper.rb.

1 голос
/ 17 июня 2011

Мне пришлось указать первичный ключ в моей модели, чтобы он работал на уровне контроллера.

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

  ...

end
1 голос
/ 23 июня 2010

Я также заметил, что вам не хватает :id => false в вашем create_table. Посмотрите на пример из статьи Арьеяна чуть более подробно:

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

Кроме того, я предпочитаю UUIDTools::UUID.random_create.to_s версии с меткой времени. YMMV.

0 голосов
/ 08 марта 2013

Вы можете не использовать строковые типы для хранения вашего UUID, так как поиск будет очень медленным. Существует 'activeuuid' gem , который выглядит многообещающе (использует двоичное хранилище).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...