8

Rails と ActiveRecord で mysql ビットを使用すると問題が発生します。Localities の公開状態を少し保存します。

`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

4

4 に答える 4

6

パブリッシュされた属性の属性リーダーを上書きできます。

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

しかし、最初の解決策 (属性リーダーの上書き) の方が優れていると思います。

于 2013-05-07T10:14:02.297 に答える
3

Rails 5 の更新: 新しい属性 API は、このような状況を処理するために作成されました。最初に、ビットからブール値へのingとブール値からビットへの ingActiveRecord::Type::Value を処理するのサブクラスを定義します。deserializecast

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次に、ヘルパーを使用してモデルの属性を定義します。

class MyModel < ApplicationRecord
  attribute :published, Values::BitBoolean.new
end
于 2017-11-29T11:35:55.697 に答える