2010-03-21 36 views
7

Tôi đang cố gắng thiết lập dự án Rails3 đầu tiên của mình và, từ rất sớm, tôi đang gặp sự cố với uuidtools, số UUIDHelper hoặc có thể gọi lại của tôi. Tôi rõ ràng đang cố gắng sử dụng UUID và (tôi nghĩ) Tôi đã thiết lập mọi thứ như mô tả trong Ariejan de Vroom's article. Tôi đã thử sử dụng UUID như một khóa chính và cũng đơn giản là một trường bổ sung, nhưng có vẻ như là UUIDHelper không bao giờ được gọi.UUID trong Rails3

Tôi đã đọc nhiều đề cập về gọi lại và/hoặc người trợ giúp thay đổi trong Rails3, nhưng tôi không thể tìm thấy bất kỳ chi tiết cụ thể nào cho tôi biết cách điều chỉnh. Đây là thiết lập của tôi vì nó đang đứng tại thời điểm này (đã có một vài lần lặp lại):

# 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 

Mọi thông tin chi tiết sẽ được đánh giá cao.

Cảm ơn.

Trả lời

4

Bạn có khai báo phương thức before_create khác trong mô hình Hình ảnh của mình không? Nếu vậy, bạn sẽ ghi đè lên một trong mô-đun UUIDHelper. Bạn sẽ muốn khai báo gọi lại theo cách khác hoặc gọi super trong callback trong mô hình hình ảnh của bạn.

Edit: Có lẽ thay đổi helper để tìm một cái gì đó như thế này:

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

Đây là cuộc gọi lại duy nhất của bất kỳ loại nào đang được thực hiện tại thời điểm này. Vì lợi ích của khả năng mở rộng, tôi chắc chắn sẽ thực hiện một thay đổi khi tôi nhận được sự cố này được tìm ra và khắc phục.Tôi đã không nhận ra rằng một cuộc gọi lại trong một người trợ giúp sẽ bị ghi đè theo cách đó, nhưng tôi đoán nó có ý nghĩa. –

+0

Tôi tiếp tục thất vọng rằng Rails không cung cấp hỗ trợ UUID nguyên bản và Rails3 - ít nhất là ở trạng thái hiện tại - dường như không hỗ trợ chỉ "hack" hợp lý mà tôi đã tìm thấy. Có một số thông tin tốt trong phản hồi này, vì vậy tôi sẽ đánh dấu nó là câu trả lời trừ khi/cho đến khi có điều gì đó tốt hơn. –

5

Nếu bạn nhận được một lỗi "NoMethodError (phương pháp xác định 'timestamp_create' cho UUID: Class)", sau đó thay đổi các nội dung của set_uuid phương pháp để:

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

tôi tin rằng điều này là cần thiết cho nhiều phiên bản gần đây của uuidtools đá quý.

1

Tôi cũng nhận thấy bạn đang thiếu :id => false trong số create_table của mình. Kiểm tra ví dụ từ bài viết của Ariejan chặt chẽ hơn một chút:

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

Ngoài ra, tôi thích UUIDTools::UUID.random_create.to_s lên phiên bản timestamp. YMMV.

1

Tôi phải chỉ định khóa chính trong mô hình của mình để làm cho nó hoạt động ở cấp bộ điều khiển.

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

    ... 

end 
1

tôi phác thảo một ví dụ UUID làm việc trong câu hỏi này:

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

Rõ ràng bạn có thể viết lại set_uuid bất kỳ cách nào bạn muốn - bạn không cần phải sử dụng GUIDs COMB.

Tín dụng: được điều chỉnh từ https://github.com/boriscy/uuidrails3/blob/master/lib/uuid_helper.rb được tham chiếu trong using UUID as primary key in rails and polymorph relationships. Cũng tìm thấy một ví dụ tại https://github.com/belucid/Recent-Updates/blob/884624e433cdffd63abd24b3bdb516a5d1596173/lib/uuid_helper.rb.

0

Bạn có thể xem xét tránh sử dụng các loại chuỗi để lưu trữ UUID của bạn, vì nó sẽ thực hiện tra cứu siêu chậm. Có một số 'activeuuid' gem trông đầy hứa hẹn (sử dụng bộ nhớ nhị phân).