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 方式”。

感谢您的任何想法。

4

2 回答 2

2

事实上,这不是最优的,但至少可以将此序列存储在 TINYBLOB 列中。

我可以像这样查询数据库

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

例如,如果列中的值10110110和带有128(100000000) 的掩码,则选择该行。

但是我必须用字符串构建conditions查询的一部分;没有基于 has 的条件,也没有占位符。

这是一个完整的(虚拟)示例,在 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)
于 2010-07-06T14:15:57.217 回答
0

你不能通过activerecord:

http://www.packtpub.com/article/Working-with-Rails-ActiveRecord-Migrations-Models-Scaffolding-and-Database-Completion

见表:

迁移列类型 | 转换为 MySQL 字段类型 | 可用选项1

:二进制 | TINYBLOB、BLOB、MEDIUMBLOB 或 LONGBLOB2 | 限制 => 1 到 4294967296(默认 = 65536)2

于 2010-07-06T08:57:47.587 回答