如何在 Rails 应用程序中使用 SHA1 摘要格式化 id 列?
How to format the id column with SHA1 digests in Rails application?
不直接在 table 中保存 SHA1 摘要字符串。是否可以在 select 语句中格式化列?
例如(希望你明白我的意思):
@item = Item.where(Digest::SHA1.hexdigest id.to_s:'356a192b7913b04c54574d18c28d46e6395428ab')
不,不是你想要的方式。您正在使用的 hexdigest
方法在数据库级别不可用。不过,您可以使用特定于数据库的函数。
例如:
Item.where("LOWER(name) = ?", entered_name.downcase)
LOWER()
函数将对数据库可用,因此它可以将 name
列传递给它。
对于您的情况,我可以建议两种解决方案:
显然,将加密字段存储在table中。然后匹配。
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
对象。
不直接在 table 中保存 SHA1 摘要字符串。是否可以在 select 语句中格式化列?
例如(希望你明白我的意思):
@item = Item.where(Digest::SHA1.hexdigest id.to_s:'356a192b7913b04c54574d18c28d46e6395428ab')
不,不是你想要的方式。您正在使用的 hexdigest
方法在数据库级别不可用。不过,您可以使用特定于数据库的函数。
例如:
Item.where("LOWER(name) = ?", entered_name.downcase)
LOWER()
函数将对数据库可用,因此它可以将 name
列传递给它。
对于您的情况,我可以建议两种解决方案:
显然,将加密字段存储在table中。然后匹配。
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
对象。