1

MySQL データベースに type のフィールドがありbitますが、値にアクセスする方法がわかりません。

ルビーdebugメソッドは私に与えます(スペースに注意してください、それらはおそらくバイナリ形式で保存された目に見えない文字です):

--- &id001 !ruby/object:Room 
attributes: 
  bit_field_false: !binary |
    AA==

  bit_field_true: !binary |
    AQ==

bit_field_falseおよびbit_field_trueである必要がfalseありtrueます。また、いくつかの奇妙なプロパティに気付きました。

  • それらを整数に変換すると、両方とも次のように表示されます0
  • と の真理値を抽出する<%= @room.bit_field_true ? "true" : "false" %><%= @room.bit_field_false ? "true" : "false" %>、両方ともtrue
  • それらを文字列として表示すると、空の文字列として表示されます

それぞれの値を取得するにはどうすればよいですか? バイナリ値は何か意味がありますか?

最終的な目標は、それらをチェックボックスに表示することです。私は次のようなものを持っています:

<% form_for(@room) do |room_f| %>
  <%= check_box_tag :room_bit_field_false %><br/>
  <%= check_box_tag :room_bit_field_true %><br/>
<% end %>

しかし、それは常にチェックされていないと表示されます。これがこのセットアップのチェックボックスを作成する方法であるかどうかは定かではないため、これも間違っている可能性がありますが、コードでビット値を抽出する方法を知りたいと思っています。

mysql参考までに、アダプターと mysqlを使用して Ruby on Rails 2.3.2 を使用していVer 14.14 Distrib 5.5.10, for osx10.6 (i386)ます。

4

2 に答える 2

2

https://stackoverflow.com/a/11394467/111884bitfieldsで提案されているよりもはるかに単純なものを発見しました(これは動作しませんでした - おそらく Rails 2 か何かでした) - method .getbyte

次の方法で最初のビットを取得できます。

bit_field_false.getbyte(0)  # Returns `0`
bit_field_true.getbyte(0)   # Returns `1`

また、これを行うことができることがわかりました:

bit_field_false == "\0"  # Returns `true`
bit_field_false == "\1"  # Returns `false`

bit_field_true == "\0"   # Returns `false`
bit_field_true == "\1"   # Returns `true`
于 2012-07-09T14:30:52.933 に答える
0

ブール値を格納するためにビット フィールドを使用しているだけの場合は、必要以上に生活を難しくしていることをお勧めします。

ここでブール値フィールドを使用すると、すべてがはるかに簡単になります。このように熱心に作業することは、通常、Rails ではなく、Rails に対して作業していることを示しています。

...そうは言っても、ビットフィールドとRedisを少し使用しました(アクセス許可を保存するため)。ActiveRecord でそれを行いたい場合は、https://github.com/grosser/bitfieldsのようなプラグインを使用すると、はるかに優れた方法のように思えます。

于 2012-07-09T11:51:46.383 に答える