使用Rails 3.1和sqlite3進行開發,測試環境。sqlite3 varchar匹配「like」但不匹配「=」
增加了一個新的表中遷移:
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生成類似的隨機十六進制數字串。
詹姆斯
我要補充一點,這個工作對我提到的,直到升級到Rails 3.1的第二個模型類。測試在那時開始失敗。 –