2017-05-11 19 views
5

Rails có thực sự không hỗ trợ đúng kiểu dữ liệu khoảng thời gian của PostgreSQL không?Rails 5 và loại dữ liệu 'Interval' của PostgreSQL

Tôi đã phải sử dụng this Stack Overflow answer từ năm 2013 để tạo cột khoảng thời gian và bây giờ có vẻ như tôi cần sử dụng this piece of code từ năm 2013 để ActiveRecord xử lý khoảng thời gian dưới dạng chuỗi.

Đó có phải là cách thực hiện không? Tôi tốt hơn hết chỉ sử dụng một kiểu dữ liệu số nguyên để đại diện cho số phút thay thế?

+1

Các nguồn đường ray dường như đề cập đến 'khoảng thời gian' trong [thích hợp] (https://github.com/rails/rails/blob/v5.1.1/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb#L112) [địa điểm] (https://github.com/rails/rails/blob/v5.1.1/activerecord/lib/active_record/connection_adapters/postgresql/schema_definitions.rb#L91) để có vẻ như Rails5 có. Tôi muốn trả lời nhưng tôi không có một thiết lập Rails5 tiện dụng để xác minh phỏng đoán của tôi và tôi không chắc chắn bao nhiêu hỗ trợ là (nếu nó thực sự là có). –

+0

Cảm ơn vì điều này. Dường như một số công cụ 'khoảng thời gian' đã được thêm khá gần đây, vì vậy tôi sẽ nâng cấp lên 5.1.1 và xem liệu nó có hoạt động tốt hơn không. –

+1

Có vẻ như việc nâng cấp sửa lỗi là vấn đề đầu tiên (cho phép bạn dễ dàng tạo cột khoảng thời gian), nhưng không sửa lỗi thứ hai (có activerecord diễn giải cột như một khoảng thời gian, chứ không phải là một chuỗi). Tôi nghĩ rằng nó có thể dễ dàng hơn để chỉ sử dụng một loại dữ liệu số nguyên. Cảm ơn đã giúp đỡ. –

Trả lời

1

Tôi đã gặp sự cố tương tự và đi kèm với phương pháp xác định trình đọc cho cột cụ thể trên mô hình ActiveRecord. Như thế này:

class DivingResults < ActiveRecord::Base 
    # This overrides the same method for db column, generated by rails 
    def underwater_duration 
    interval_from_db = super 
    time_parts = interval_from_db.split(':') 
    if time_parts.size > 1 # Handle formats like 17:04:41.478432 
     units = %i(hours minutes seconds) 
     in_seconds = time_parts 
     .map.with_index { |t,i| t.to_i.public_send(units[i]) } 
     .reduce(&:+) # Turn each part to seconds and then sum 
     ActiveSupport::Duration.build in_seconds 
    else # Handle formats in seconds 
     ActiveSupport::Duration.build(interval_from_db.to_i) 
    end 
    end 
end 

Điều này cho phép sử dụng trường hợp ActiveSupport::Duration ở nơi khác. Hy vọng rằng Rails sẽ bắt đầu xử lý kiểu dữ liệu khoảng thời gian PostgreSQL tự động trong tương lai gần.

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