2010-07-06 3 views
3

Я нашел хороший способ хранения некоторых данных в базе данных с двоичной последовательностью, например 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 Way».

Спасибо за любую идею.

ответ

2

Фактически, это не оптимально, но, по крайней мере, он работает, чтобы сохранить эту последовательность в столбце TINYBLOB.

можно запрашивать базу данных, как этот

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

Например, со значением в столбце 10110110 и маски с 128 (100000000) выбрана строка.

Но мне пришлось построить часть запроса с помощью строки ; нет основанных на использовании условий, и нет заполнителя.

Вот полный (манекен) Exemple, в 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) 
0

вы не можете с помощью ActiveRecord:

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

см в таблице:

миграции колонного типа | Преобразует в тип поля MySQL | Доступные варианты1

: бинарные | TINYBLOB, BLOB, MEDIUMBLOB или LONGBLOB2 | limit => 1 to 4294967296 (по умолчанию = 65536) 2

+0

Это был также мой вывод после просмотра исходного кода AR. – jlecour

Смежные вопросы