2010-07-06 38 views
3

我發現了一種很好的方法,可以使用二進制序列(如0b0101000)將某些數據存儲在數據庫中,並查找在應用掩碼後給出肯定結果的行。存儲/查詢二進制序列並使用掩碼搜索

例如:SELECT (0b0101010 & (1<<3 | 1<<5))>0;允許我獲取第3或第5位的行,而不管其他位是否打開。

問題是當我想用ActiveRecord來做到這一點。 此遷移add_column :table, :column, :binary, :limit => 8.bytes實際上創建了一個TINYBLOB列,而不是BINARYVARBINARY,我無法將我的掩碼應用於其值,因爲它不被視爲二進制值。

我知道我可以通過執行原始SQL語句,然後使用原始SQL段爲此部分查詢我的表,從而在遷移中製作正確的列格式,但它看起來不像「Rails方式」。

謝謝你的任何想法。

回答

2

事實上,它並不是最優的,但至少它能將這個序列存儲在TINYBLOB列中。

我可以查詢數據庫這樣

SELECT * FROM table WHERE (column & mask) = mask 

例如,具有在10110110列和行選擇的值與128(100000000)的掩模。

但我不得不使用字符串構建查詢的conditions部分;沒有基於條件,也沒有佔位符。

這是一個完整的(虛擬)爲例,在Ruby中:

find_conditions = [] 

find_conditions[0] = 'string_col = ?' 
find_conditions << 'a_value_for_the_string_col' 

binary_mask = "01100101" 
find_conditions[0] += ' AND ' 
find_conditions << "(bin_col & #{binary_mask.to_i(2)}) = #{binary_mask.to_i(2)}" 

results = Model.all(:conditions => find_conditions)