2014-04-10 15 views
5

Tôi đã thử tính năng enum mới của đường ray 4.1 và có một số rắc rối với nó.Rails 4.1 Enums: enum.status = nil

Mô hình của tôi trông như thế này:

class Report < ActiveRecord::Base 
    after_save :notify_clients 
    before_update :update_progress 
    before_create do 
    self.status ||= 'started' 
    end 

    enum status: %w{started active fail success} 

    #... 
end 

Và nếu tôi cố gắng sử dụng nó trong quan điểm của tôi như thế này:

.item{class: @report.status, data: {id: @report.id}} 

tôi sẽ thấy điều này trong trình duyệt của tôi

<div class="item" data-id="25"> 

Tôi đã cố gắng tìm hiểu những gì status thực sự đang sử dụng rails console:

[11] pry(main)> Report.all.sample.status 
    Report Load (0.3ms) SELECT `reports`.* FROM `reports` 
    => nil 
    [12] pry(main)> Report.all.sample.status 
    Report Load (0.2ms) SELECT `reports`.* FROM `reports` 
    => nil 
    [13] pry(main)> Report.all.sample.status 
    Report Load (0.3ms) SELECT `reports`.* FROM `reports` 
    => nil 
    [14] pry(main)> Report.all.sample.status 
    Report Load (0.2ms) SELECT `reports`.* FROM `reports` 
    => nil 

Và bây giờ xem xét điều này:

[22] pry(main)> Report.all.sample.attributes['status'] 
    Report Load (0.2ms) SELECT `reports`.* FROM `reports` 
    => "3" 

Tôi không nhận được nó ...

+0

Tôi có câu hỏi tương tự: Tại sao giá trị enum của tôi luôn được giải quyết là không? @ WillKoehler của câu trả lời đã làm các trick. – plusjeff

Trả lời

12

tôi đã cùng một vấn đề. Nó được gây ra bởi vì trường enum được định nghĩa là một chuỗi trong lược đồ của tôi thay vì một số nguyên. Trong trường hợp của bạn, status có thể được định nghĩa là một chuỗi trong lược đồ của bạn.

class CreateReport < ActiveRecord::Migration 
    def change 
    create_table :reports do |t| 
     ... 
     t.integer :status  # if this is t.string you get the symptoms described above! 
     ... 
    end 
    end 
end 
0

Ngoài ra bạn có thể tiếp tục sử dụng chuỗi trong schema của bạn, nhưng nó có nghĩa là bạn phải lập bản đồ một cách rõ ràng mối quan hệ giữa thuộc tính và giá trị cơ sở dữ liệu sử dụng băm. Một cái gì đó như thế này;

enum status: { started: 'START', active: 'ACT', fail: 'FAIL', success: 'SUCC'} 
Các vấn đề liên quan