不直接在表中保存SHA1摘要字符串。是否可以在select语句中格式化列?
例如(希望你知道我的意思):
@item = Item.where(Digest::SHA1.hexdigest id.to_s:'356a192b7913b04c54574d18c28d46e6395428ab')
答案 0 :(得分:1)
不,不是你想要的方式。您正在使用的hexdigest
方法在数据库级别不可用。您可以使用特定于数据库的功能。
例如:
Item.where("LOWER(name) = ?", entered_name.downcase)
LOWER()
函数可供数据库使用,因此可以将name
列传递给它。
对于您的情况,我可以建议两种解决方案:
显然,将加密字段存储在表格中。然后匹配。
key = '356a192b7913b04c54574d18c28d46e6395428ab'
Item.where(encrypted_id: key)
迭代所有列值(在您的情况下为ID)并找到匹配的列值:
all_item_ids = Item.pluck("CAST(id AS TEXT)")
item_id = all_item_ids.find{ |val| Digest::SHA1.hexdigest(val) == key }
然后,您可以使用Item.find(item_id)
获取该项,或使用Item.where(id: item_id)
获取ActiveRecord::Relation
个对象。