2010-03-06 62 views
6

Tôi đang cố gắng sử dụng UUID làm khóa chính cho ứng dụng Rails và đang gặp sự cố sau sự cố.Rails + UUID tạo lược đồ giả định UUID là một số nguyên chứ không phải là một chuỗi

Tôi đang xác định trong quá trình di chuyển này: create_table: người dùng,: id => false do | t | thì đây: thực hiện ("ALTER TABLE ADD người dùng PRIMARY KEY (uuid)")

Trong mô hình của tôi sử dụng: set_primary_key "UUID"

Sử dụng các công cụ UUID để tạo ra các UUID.

này là tất cả làm việc tuyệt vời, vấn đề Tôi hiện đang có là schema.rb mà được vẻ tạo ra như thế này:

create_table "người sử dụng",: primary_key => "UUID",: force => true do | t |

Giả định rằng cột khóa chính là số nguyên 11 thay vì chuỗi ký tự 36, do đó việc di chuyển sẽ tạo ra cơ sở dữ liệu chính xác, nhưng cơ sở dữ liệu thử được tạo không chính xác và nếu tôi chạy runke db: schema: load , nó sẽ thất bại cũng ...

Cần phải tìm ra cách để ghi đè lên cách mà schema.rb giả định rằng nếu có một cột khóa chính rằng nó sẽ là một số nguyên ....

Trả lời

0

Tôi gặp sự cố này. Theo như tôi có thể nói, nó không thể ghi đè yêu cầu của đường ray rằng PK là một số nguyên. Những gì tôi đã làm để bỏ qua điều này đã thêm một khóa duy nhất trên cơ sở dữ liệu và sau đó thiết lập phạm vi mặc định của tôi trên mỗi mô hình để tìm kiếm qua chuỗi duy nhất của tôi thay vì số nguyên thông thường

1

Chúng tôi đã sử dụng UUID làm khóa chính cho thời gian dài (hiện tại với Rails 3.0.0), nhưng cho đến nay đã không tìm thấy một cách để làm cho Schema dumper hiểu rằng không có id nguyên.

Vì vậy, giải pháp của chúng tôi đã được sửa chữa lược đồ bằng tay, khi cần thiết. Ví dụ: luôn sau rake db:migrate. : D

Chúng tôi chỉ cần thay đổi dòng

create_table "nhân dân",: force => true làm | t |

để

create_table "nhân dân",: id => sai,: force => làm đúng | t |

t.string "id", :limit => 22, :null => false 

Khá khó chịu nhưng sau đó mọi thứ hoạt động. Vì vậy, vấn đề không phải là trong Rails không cho phép các khóa chính UUID, nhưng lược đồ dumper không hiểu chúng.

3

Tôi nghĩ cách tiếp cận tốt nhất là chuyển từ quản lý lược đồ của bạn sang Ruby (schema.rb) để quản lý lược đồ trong SQL (development_structure.sql).

Để làm điều này:

  1. Trong application.rb thiết config.active_record.schema_format = :sql
  2. Xóa tập tin schema.rb của bạn.
  3. Mỗi khi bạn chạy rake db:migrate, hãy chạy rake db:dump:structure. Điều đó sẽ đổ lược đồ của bạn đến db/development_structure.sql. Khi bạn chạy rake db:test:prepare, giờ đây, tệp này sẽ sử dụng tệp development_structure.sql thay vì tệp scheam.rb.

Bạn có thể đọc thêm về điều này trong phần 6.2 của hướng dẫn di chuyển (http://guides.rubyonrails.org/migrations.html).

+0

Đó chính là giải pháp –

Các vấn đề liên quan