2011-10-28 35 views
9

Tôi đang sử dụng Rails 3.1.1 với PostgreSQL 9.1 và earthdistance module. Để có thể tính toán khoảng cách giữa các vị trí khác nhau một cách chính xác, tôi đã thiết lập một cột với loại earth trong bảng branches của tôi.Loại cơ sở dữ liệu tùy chỉnh trong ActiveRecord

Vấn đề tôi đang trải qua bây giờ là ứng dụng Rails tôi có sử dụng bảng này không hiểu các loại đất và do đó tôi nhận được này trong tôi db/schema.rb:

# Could not dump table "branches" because of following StandardError 
# Unknown type 'earth' for column 'location'

Đây là vấn đề vì bây giờ tôi có thể' t tạo cơ sở dữ liệu thử nghiệm của tôi từ schema.rb.

Tôi làm cách nào để thêm loại này vào AR hoặc làm cho nó bỏ qua cột đó?

+1

Tìm thấy câu trả lời cho câu hỏi ở đây: http://stackoverflow.com/questions/383058/rails-schema-creation-problem –

+7

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

Trả lời

5

Hãy thử điều này:

Thay đổi bạn config/application.rb

config.active_record.schema_format = :sql 

này sẽ thay đổi định dạng đầu ra sang định dạng PostgreSQL SQL bản địa, schema.rb sẽ bị vô hiệu và một tập tin mới sẽ được tạo ra /db/config/structure.sql

+0

Tôi đã thử điều này, nhưng đường ray 'db: schema: load' vẫn có vẻ tìm tệp' schema.rb'. –

+0

Có vẻ như bạn phải sử dụng 'rake db: structure: load' để thay thế. –

5

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_typeaddress_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 đồ.

+0

Điều này không hiệu quả đối với tôi trong Rails 4.2.8, có một số công thức khác mà tôi cần sử dụng không? –

+0

Bạn có thể chia sẻ thêm thông tin về lỗi mà bạn đang gặp phải và có thể đặt mã của bạn trong một ý chính và tìm tôi không? –

+0

Tôi chạy chính xác những gì bạn đã nhập và nó không hoạt động trong 5.0.1 hoặc – Kasumi

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