1

bit在 MySQL 数据库中有一个类型的字段,但我不确定如何访问该值。

rubydebug方法给了我(注意空格,它们可能是以二进制形式存储的不可见字符):

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

  bit_field_true: !binary |
    AQ==

bit_field_falsebit_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 %>

但它总是显示为未选中。我不确定这是如何为此设置创建复选框,所以这也可能是错误的,但不管我想知道如何在代码中提取位值。

作为参考,我使用的是 Ruby on Rails 2.3.2,带有mysql适配器和 mysql Ver 14.14 Distrib 5.5.10, for osx10.6 (i386)

4

2 回答 2

2

我发现了比https://stackoverflow.com/a/11394467/111884bitfields建议的要简单得多的东西(我无法开始工作 - 也许是 rails 2 或其他东西) - 方法。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,而不是使用它。

...话虽如此,我已经使用了位字段和 Redis(用于存储权限)。如果您想在 ActiveRecord 中执行此操作,像https://github.com/grosser/bitfields这样的插件似乎是一种更好的方法。

于 2012-07-09T11:51:46.383 回答