我找到了一种很好的方法,可以使用二进制序列(例如0b0101000
)在数据库中存储一些数据,并找到在应用掩码后给出正结果的行。
例如:SELECT (0b0101010 & (1<<3 | 1<<5))>0;
允许我获取第3或第5位的行,无论其他位是打开还是关闭。
问题是我想用ActiveRecord做这件事。
此迁移add_column :table, :column, :binary, :limit => 8.bytes
实际上创建了TINYBLOB
列,而不是BINARY
或VARBINARY
,我无法将掩码应用于其值,因为它不被视为二进制值
我知道我可以通过执行原始SQL语句在迁移中创建正确的列格式,然后使用原始SQL段查询我的表,但它看起来不像“Rails方式”。
感谢您的任何想法。
答案 0 :(得分: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)
答案 1 :(得分:0)
你不能通过activerecord:
见表:
迁移列类型|转换为MySQL字段类型|可用选项1
:二进制| TINYBLOB,BLOB,MEDIUMBLOB或LONGBLOB2 | limit =&gt; 1至4294967296(默认值= 65536)2