Một trường hợp khác mà ai đó có thể chạy vào đây là khi chèn các loại postgres tùy chỉnh của bạn (enums) vào postgresql. Nếu bạn thực hiện điều này và vẫn muốn sử dụng Ruby cho schema.rb của mình, bạn có thể thêm các kiểu cơ sở dữ liệu tùy chỉnh vào danh sách các loại hợp lệ của bộ điều hợp.
Ví dụ: giả sử bạn có di chuyển như vậy, với address_type
và address_status
.
class CreateAddresses < ActiveRecord::Migration
def up
execute <<-SQL
CREATE TYPE address_status AS ENUM ('active', 'archived');
CREATE TYPE address_type AS ENUM ('billing', 'shipping');
SQL
create_table :customer_addresses do |t|
# bla bla
t.column :address_type, :address_type
t.column :status, :address_status
t.timestamps null: false
end
end
def down
drop_table :customer_addresses
execute <<-SQL
DROP TYPE address_type;
DROP TYPE address_status;
SQL
end
end
Sau đó, trong tạo ra một khởi tạo hoặc thêm một cái gì đó như thế này để application.rb của bạn:
# config/initializers/postres_enum_custom_types.rb
module ActiveRecord
module ConnectionAdapters
if const_defined?(:PostgreSQLAdapter)
class PostgreSQLAdapter
NATIVE_DATABASE_TYPES.merge!(
address_status: { name: 'character varying' },
address_type: { name: 'character varying' }
)
end
end
end
end
Thuyết minh về giải pháp của tôi:
- tôi đang kiểm tra sự tồn tại của
PostgreSQLAdpater
vì về cách thức một gem phân tích tĩnh tôi đang sử dụng một phần tải một số phụ thuộc AR - cụ thể là đá quý annotate
.
- Nguồn cho định nghĩa ban đầu is here.
cơ bản về hoạt động của tôi vào đây: Khi điều này xảy ra với tôi trong đường ray 5.0.x, sự di cư chạy tốt, nhưng sau đó môi trường thử nghiệm của tôi sẽ thất bại khi cố gắng chạy db:test:prepare
hoặc db:reset
. Tôi đã mất khá nhiều thời gian để theo dõi vấn đề này xuống vấn đề kết xuất giản đồ.
Nguồn
2017-08-01 06:24:24
Tìm thấy câu trả lời cho câu hỏi ở đây: http://stackoverflow.com/questions/383058/rails-schema-creation-problem –
Nó rất hữu ích cho những người khác để viết ra một câu trả lời cho câu hỏi thậm chí của riêng bạn và chấp nhận nó. Nó cũng đưa câu hỏi này ra khỏi danh sách chưa được trả lời. – Nick