2014-04-10 13 views
5

मैंने रेलों की नई enum फ़ीचर 4.1 की कोशिश की और इसके साथ कुछ परेशानीएं हैं।रेल 4.1 एनम्स: enum.status = nil

मेरे मॉडल इस तरह दिखता है:

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 

और मैं इस तरह मेरे विचार में यह उपयोग करने का प्रयास करता है, तो:

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

मैं अपने ब्राउज़र में इस देखेंगे

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

मैंने यह पता लगाने की कोशिश की कि status वास्तव में 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 

और अब इसे देखो:

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

मैं समझ नहीं है ...

+0

मेरे पास एक समान प्रश्न था: मेरे enum मूल्यों को हमेशा शून्य के रूप में क्यों हल किया जा रहा है? @ विलकोहलर के जवाब ने चाल की। – plusjeff

उत्तर

12

मैं एक ही समस्या थी। ऐसा इसलिए हुआ क्योंकि enum फ़ील्ड को एक पूर्णांक की बजाय मेरी स्कीमा में एक स्ट्रिंग के रूप में परिभाषित किया गया था। आपके मामले में, status शायद आपकी स्कीमा में एक स्ट्रिंग के रूप में परिभाषित किया गया है।

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

इसके अलावा, आप अपने स्कीमा में स्ट्रिंग का उपयोग करना जारी रख सकते हैं, लेकिन यह मतलब है कि आप स्पष्ट रूप से विशेषता और हैश का उपयोग कर डेटाबेस मूल्य के बीच संबंध मैप करने के लिए है। ऐसा कुछ;

enum status: { started: 'START', active: 'ACT', fail: 'FAIL', success: 'SUCC'} 
संबंधित मुद्दे