2010-07-26 28 views
5

Tôi đã chạy với một vấn đề mà tôi tin là lỗi Active Records. Tôi đang phân tích cú pháp tệp XML chứa công việc. Tệp xml này chứa các nút chỉ ra thời gian ở định dạng thời gian là 00:00:00. Tôi cũng có một mô hình sẽ chấp nhận những công việc này. Tuy nhiên, khi thời gian lớn hơn thời gian 24H thực tế, bản ghi Hoạt động sẽ chèn nó dưới dạng NULL. Ví dụ bên dưới:Chèn thời gian vào một cột thời gian với Ruby on Rails

INSERT INTO `jobs` (`jobid`, `walltime`) VALUES('71413', 'NULL') 

INSERT INTO `jobs` (`jobid`, `walltime`) VALUES('71413', '15:24:10') 

Bất kỳ ý tưởng nào? Cảm ơn bạn!

+0

vấn đề của bạn, bạn sẽ xin giải thích một cách chi tiết là gì? Nó mang lại cho lỗi hay cái gì? – Salil

+0

Là 'walltime' trong cơ sở dữ liệu của bạn được cấu hình để chấp nhận varchar hoặc văn bản? Hay là một loại thời gian được định dạng ma thuật? (Nếu đây là ứng dụng của tôi, tôi sẽ lưu trữ số giây như một số nguyên trong cơ sở dữ liệu và để định dạng nó thành dạng xem.) – sarnold

+1

Trên cơ sở dữ liệu nào chạy nó? Nếu đó là MySQL và thuộc tính walltime là kiểu Time, đây có thể là một sự bắt thú vị, vì MySQL có thể xử lý thời gian trôi qua thông qua kiểu Time và trong trường hợp đó ActiveRecord shoudn't typecast thuộc tính walltime thành NULL. –

Trả lời

5

Các tiêu chuẩn tiêu chuẩn SQL timedatetime loại dữ liệu không có ý định lưu trữ thời lượng. Có thể phù hợp với các tiêu chuẩn đó, ActiveRecord's time attribute assignment logic sử dụng time parsing rules of the native Ruby Time class để từ chối thời gian trong ngày không hợp lệ.

Cách để lưu trữ khoảng thời gian, như bạn có ý định, là một trong hai:

  1. cửa hàng trong suốt thời gian như một số nguyên (ví dụ: "số giây"), hoặc
  2. cửa hàng hai (ngày) lần, một bắt đầu và kết thúc, và sử dụng số học ngày trên chúng.
class Thing < ActiveRecord::Base 
    ... 
    def duration 
    return start - end 
    end 

    def duration=(length) 
    start = Time.now 
    end = start + length 
    end 
    ... 
end 
+1

Đây không phải là trường hợp cho MySQl (không biết về triển khai khác). Xem tại đây: http://dev.mysql.com/doc/refman/5.0/en/time.html ("... giá trị có thể dao động từ '-838: 59: 59' đến '838: 59: 59'. Phần giờ có thể quá lớn vì loại TIME có thể được sử dụng không chỉ để biểu thị thời gian trong ngày (phải ít hơn 24 giờ), mà còn thời gian trôi qua hoặc khoảng thời gian giữa hai sự kiện (có thể lớn hơn nhiều 24 giờ, hoặc thậm chí tiêu cực). ") –

+0

Hi Milan - có, MySql cũng có thể hỗ trợ lưu trữ thời gian trong một cột Thời gian - nhưng vì Bản ghi Hoạt động được dự định là tương thích chéo-db - nó vẫn có thể" hữu ích "giải thích thời gian như một đồng hồ thời gian chỉ. Do đó, nó sẽ tiếp tục vô hiệu hóa bất kỳ thứ gì mà nó thấy là "thời gian không hợp lệ". Vì vậy, tùy chọn thời gian ở đây có lẽ là một đặt cược tốt hơn để đảm bảo rằng nó sẽ thực sự hoạt động. –

+1

@Taryn Theo nghi ngờ của chúng tôi, tôi đã tìm thấy mã thực hiện chính xác điều đó. –

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