Rails 3.1およびsqlite3を開発環境、テスト環境に使用します。sqlite3 varcharは "like"と一致しますが、 "="は一致しません。
は、移行中に新しいテーブルを追加しました:ActiveRecordのモデルでは
create_table "api_keys", :force => true do |t|
t.string "api_key"
t.integer "user_id"
t.datetime "created_at"
t.datetime "updated_at"
end
:
create_table :api_keys do |t|
t.string :api_key
t.integer :user_id
t.timestamps
end
これは、次のスキーマを持つテーブルを作成
before_create :fill_api_key
private
def fill_api_key
self.api_key = SecureRandom.hex(30)
end
のActiveRecordの動的なファインダーメソッドfind_by_api_key(api_key)
は機能しません(nilを返します)。同じで:sqlite3ので
ApiKey.where({:api_key => 'something'}).first
、私は次の操作を行います
insert into api_keys (id, api_key) values (-1, '12345');
私は今、選択を実行する場合:
select api_keys.* from api_keys where api_keys.api_key = '12345';
レコードが見つかります。私が実行した場合私のアプリから作成
既存のデータが表示され、フィルタリングされていない選択:
select api_keys.* from api_keys;
を私はのいずれかから私のクエリに長い16進数文字列を貼り付けることで、既存のレコードを検索しようとした場合既存のレコード:
select api_keys.* from api_keys where api_keys.api_key = 'long hex string';
この場合、結果は返されません。私がこれを試してみると:
select api_keys.* from api_keys where api_keys.api_key like 'long hex string';
私はマッチを得ます。
私はapi_keys.api_keyにインデックスを作成しましたが、それは効果がありませんでした。
この問題は、Digest :: SHA1 :: hexdigestを使用して同様の文字列の乱数16進数を生成する他の1つのモデルに影響します。ジェームズ
私はこれは私が3.1をレールにアップグレードするまで言及した第2のモデルクラスに取り組んでいることを追加する必要があります。その時点でテストは失敗し始めました。 –