2010-04-11 24 views
15

Tôi tự hỏi làm thế nào tôi có thể tạo kiểu dữ liệu tùy chỉnh để sử dụng trong tệp di chuyển rake. Ví dụ: nếu bạn sẽ tạo mô hình, bên trong tệp di chuyển, bạn có thể thêm cột. Nó có thể trông như thế này:Đường ray: tạo kiểu dữ liệu tùy chỉnh/tạo tốc ký

def self.up 
    create_table :products do |t| 
     t.column :name, :string 
     t.timestamps 
    end 
    end 

Tôi muốn biết làm thế nào để tạo ra một cái gì đó như thế này:

t.column :name, :my_custom_data_type 

Lý do cho điều này để tạo ra ví dụ như một "tệ" loại, đó là không có gì nhiều hơn nữa so với một số thập phân với độ chính xác là 8 và thang điểm là 2. Vì tôi chỉ sử dụng MySQL, giải pháp cho cơ sở dữ liệu này là đủ.

Cảm ơn bạn đã phản hồi và nhận xét!

+0

Sử dụng loại dữ liệu điểm động cho tiền tệ thường là một ý tưởng tồi tệ. –

+0

Nếu bạn có một giải pháp tốt hơn, hãy làm phức tạp. – Shyam

+1

Sử dụng một cái gì đó như đá quý tiền, http://money.rubyforge.org/. – theIV

Trả lời

21

Điều bạn đang muốn làm là xác định phương pháp tạo cột mới cung cấp các tùy chọn để tạo loại tùy chỉnh của bạn. Việc cơ bản được thực hiện bằng cách thêm phương thức hoạt động như t.integer ... trong di chuyển. Bí quyết là tìm ra nơi để thêm mã đó.

Một số nơi trong initializers nơi thư mục của bạn đoạn mã này:

module ActiveRecord::ConnectionAdapters 
    class TableDefinition 
    def currency (*args) 
     options = args.extract_options! 
     column_names = args 
     options[:precision] ||= 8 
     options[:scale] ||= 2 
     column_names.each { |name| column(name, 'decimal', options) } 
    end                  
    end 
end 

Bây giờ bạn có thể sử dụng phương pháp tiền tệ làm định nghĩa một cột tệ bất kỳ lúc nào bạn cần nó.

Ví dụ:

def self.up 
    create_table :products do |t| 
    t.currency :cost 
    t.timestamps 
    end 
end 

Để thêm một cột tệ để một bảng hiện có:

def self.up 
    change_table :products do |t| 
    t.currency :sell_price 
    end 
end 

Nên biết trước: Tôi không có thời gian để thử nghiệm nó, vì vậy không có bảo đảm. Nếu nó không hoạt động, ít nhất cũng nên đưa bạn đi đúng hướng.

+0

Tôi sẽ kiểm tra điều này ngay lập tức. Cảm ơn bạn đã nỗ lực và giúp đỡ của bạn! – Shyam

+0

Cảm ơn, tôi đã sử dụng nó. Một điều cần lưu ý: 't' là một' TableDefinition' trong 'create_table', nhưng một' Bảng' trong 'change_table'. Tôi đặt mã thế hệ tùy chỉnh của mình vào một mô-đun và đưa vào cả hai lớp đó. – Kolja

+0

Hi @emfi Điều này thực sự tốt .. Có cách nào để làm cho nó tiếp tục giống như có một loại tiền tệ Model? Chỉ là một ý nghĩ bởi vì tôi muốn ví dụ cho xác nhận đầu vào tiền tệ tại cùng một vị trí .. Tôi cũng sẽ tìm kiếm điều đó..thanks – sethi

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