2012-07-09 40 views
1

我在MySQL數據庫中有一個類型爲bit的字段,但我不確定如何訪問該值。如何在rails 2上訪問ruby中的bit數據類型?

紅寶石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)

回答

0

如果你只是使用位域來存儲布爾值,我建議你讓自己的生活比需要更難。

在這裏使用布爾字段,它會更簡單。像這樣努力工作通常表明您正在對抗Rails,而不是它。

......話雖如此,我已經在位字段和Redis上工作了一段時間(用於存儲權限)。如果你想在ActiveRecord中做到這一點,像https://github.com/grosser/bitfields這樣的插件似乎是一個更好的方法來做到這一點。

+1

我正與現有數據庫的工作,與軌道站點是更多的在其他地方生成的數據包裝。因此,比修改數據庫更容易獲得位數據類型的工作。感謝關於bitfields插件的提示 - 我會試一試。 – zlog 2012-07-09 13:18:08

+0

當你在第二段中說'boolean'時,我認爲你的意思是一個替代,比如一個整數。如果我沒有記錯的話,除非你將位域堆積成更大的數量(由於它們被如何存儲,所以數量爲8),所以你沒有真正節省空間。除非你有嚴格的空間限制,否則本地整數速度,加上處理Rails的難易程度,將會成爲一個更好的選擇。 – GoinAum 2013-11-01 03:43:37

2

我發現了一些比bitfields簡單得多的東西,正如https://stackoverflow.com/a/11394467/111884(我無法工作 - 也許它是rails2或其他) - 方法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` 
相關問題