你如何在rails 2上访问ruby中的mysql数据类型?

时间:2012-07-09 10:56:48

标签: mysql ruby-on-rails ruby

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

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

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

  bit_field_true: !binary |
    AQ==

bit_field_falsebit_field_true应分别为falsetrue。我也注意到一些奇怪的属性:

  • 当我将它们转换为整数时,它们都显示为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)

2 个答案:

答案 0 :(得分:2)

https://stackoverflow.com/a/11394467/111884建议发现比bitfields简单得多的东西(我无法工作 - 也许是rails 2或其他东西) - 方法getbyte。< / p>

你可以得到第一位:

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`

答案 1 :(得分:0)

如果您只是使用位字段来存储布尔值,我建议您让自己的生活变得更加艰难。

在这里使用布尔字段,这一切都会简单得多。像这样努力工作通常表明你正在反对Rails而不是它。

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