2013-05-07 7 views
5

के साथ काम कर रहा है मुझे रेल और ActiveRecord में एक MySQL बिट के साथ काम करने में समस्याएं आ रही हैं। हम प्रकाशित राज्यों के लिए राज्यों के लिए थोड़ा सा स्टोर करते हैं।रेल/ActiveRecord mysql बीआईटी

`published` bit(1) NOT NULL 

मैंने इसे रेल में published:binary के रूप में मचान किया।

Locality.first.published"\x01" देता है।

मुझे इस क्षेत्र को बूलियन के रूप में कैसे इलाज करने के लिए रेल मिलते हैं?

एक स्टैल्ड टिकट है लेकिन हैकिंग ActiveRecord वास्तव में एक विकल्प नहीं है। https://rails.lighthouseapp.com/projects/8994/tickets/6102-activerecord-boolean-support-with-bit1-mysql-data-type

उत्तर

5

आप अपने प्रकाशित विशेषता की विशेषता पाठक के ऊपर लिख सकते हैं:

class Locality < ActiveRecord::Base 
    # overwrite the attribute reader of the published attribute 
    def published 
    self.read_attribute(:published) == "\x01" ? true : false 
    end 
end 

अद्यतन

या आप कर सकते हैं

class Locality < ActiveRecord::Base 
    def to_boolean 
    self.published == "\x01" ? true : false 
    end 
end 

तो अपने बूलियन वापसी मान के लिए एक विधि उत्पन्न कॉल करें:

Locality.first.published.to_boolean => true || false 

लेकिन मुझे लगता है कि पहला समाधान (ओवरराइटिंग विशेषता पाठक) बेहतर है।

+0

मैंने पहले से ही ऐसा करने के बारे में सोचा है, लेकिन यह एक अच्छा समाधान की तरह प्रतीत नहीं होता है। –

+0

और क्यों नहीं? आप थोड़ी देर के बजाय एक सामान्य बूलियन क्षेत्र का उपयोग क्यों नहीं कर रहे हैं? – Mattherick

+0

मेरा जवाब अपडेट किया गया। – Mattherick

0

यहाँ एक विस्तार @ ऊपर Mattherick के उत्तर के आधार पर विधि:

lib/एक्सटेंशन/active_record/bit_boolean.rb

module Extensions::ActiveRecord 
    module BitBoolean 
    extend ActiveSupport::Concern 

    class_methods do 
     def alias_bit_to_boolean(attribute) 
     define_method("#{attribute}?") do 
      self.send(attribute) == "\x01" ? true : false 
     end 
     end 
    end 

    end 
end 

ActiveRecord::Base.send(:include, Extensions::ActiveRecord::BitBoolean) 

और एक प्रारंभकर्ता में आवश्यकता होती है:

config/प्रारंभकर्ता/एक्सटेंशन.आरबी

require File.join(Rails.root, 'lib/extensions/active_record/bit_boolean.rb') 

कौन सा तो किया जा सकता है:

class Locality < ActiveRecord::Base 
    alias_bit_to_boolean :published 
end 

यह एक locality.published? विधि का उत्पादन करेगा।

0

आपकी मदद @Mattherick के लिए धन्यवाद।

आपकी मदद की मैं कुछ आसान का निर्माण किया है के साथ:

def highlight 
    self.read_attribute(:highlight) == "\x01" ? true : false 
    end 

    def highlight=(value) 
    content_value = (value == false || value == 0 || value == "0") ? "\x00" : "\x01" 
    self.write_attribute(:highlight,content_value) 
    end 

highlight क्षेत्र BIT डेटाबेस पर के रूप में जमा का नाम है। और यह समाधान भी परिवर्तन की आवश्यकता के बिना दृश्य पर checkbox साथ काम करता है: रेल 5 के लिए

<div class="field"> 
    <%= f.label :highlight %> 
    <%= f.check_box :highlight %> 
    </div> 
0

अद्यतन: नई विशेषताओं एपीआई सिर्फ इस तरह की स्थितियों से निपटने के लिए किया जाता है।

class MyModel < ApplicationRecord 
    attribute :published, Values::BitBoolean.new 
end 
:

module Values 
    class BitBoolean < ActiveRecord::Type::Value 
    BIT_FALSE = "\x00" 
    BIT_TRUE = "\x01" 

    def cast(value) 
     value ? BIT_TRUE : BIT_FALSE 
    end 

    def deserialize(value) 
     value == BIT_TRUE 
    end 
    end 
end 

तो फिर तुम attribute सहायक के साथ अपने मॉडल पर प्रत्येक का उपयोग करता है: पहले आप बिट करने के लिए बूलियन से वापस ing ActiveRecord::Type::Value कि बिट से deserialize आईएनजी संभालती बूलियन के लिए, और cast का एक उपवर्ग को परिभाषित

संबंधित मुद्दे