3

0b0101000マスクを適用した後に肯定的な結果を与える行を見つけるなど、データベースにデータをバイナリシーケンスで保存する良い方法を見つけました。

例:SELECT (0b0101010 & (1<<3 | 1<<5))>0;他のビットがオンかオフかに関係なく、3番目または5番目のビットがオンの行を取得できます。

問題は、これを ActiveRecord で実行したい場合です。この移行add_column :table, :column, :binary, :limit => 8.bytesにより、実際にはorTINYBLOBではなく列が作成され、バイナリ値と見なされないため、その値にマスクを適用できません。BINARYVARBINARY

生の SQL ステートメントを実行し、この部分の生の SQL セグメントを使用してテーブルにクエリを実行することにより、移行で適切な列形式を作成できることはわかっていますが、「Rails の方法」とは思えません。

アイデアをありがとう。

4

2 に答える 2

2

実際、これは最適ではありませんが、少なくともこのシーケンスを TINYBLOB 列に格納するために機能します。

このようにデータベースにクエリを実行できます

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

たとえば、列の値と(100000000) の10110110マスクを使用すると、行が選択されます。128

しかし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

あなたはアクティブレコード経由ではできません:

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

表を参照してください:

移行列の種類 | MySQL フィールド型に変換 | 利用可能なオプション1

:バイナリ | TINYBLOB、BLOB、MEDIUMBLOB、または LONGBLOB2 | limit => 1 ~ 4294967296 (デフォルト = 65536)2

于 2010-07-06T08:57:47.587 に答える