Использование Rails 3.1 и sqlite3 для среды разработки, тестирования.
Добавлена новая таблица в миграции:
create_table :api_keys do |t|
t.string :api_key
t.integer :user_id
t.timestamps
end
Это создает таблицу со следующей схемой:
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
В модели ActiveRecord:
before_create :fill_api_key
private
def fill_api_key
self.api_key = SecureRandom.hex(30)
end
Метод динамического поиска ActiveRecord find_by_api_key(api_key)
не работает (возвращает ноль). То же самое с:
ApiKey.where({:api_key => 'something'}).first
В sqlite3 я делаю следующее:
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;
Если я пытаюсь найти ранее существующую запись, вставив в свой запрос длинную шестнадцатеричную строку из одной из этих ранее существующих записей:
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.
Джеймс