如何在 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 列传递给它。

对于您的情况,我可以建议两种解决方案:

  1. 显然,将加密字段存储在table中。然后匹配。

    key = '356a192b7913b04c54574d18c28d46e6395428ab'
    Item.where(encrypted_id: key)
    
  2. 遍历所有列值(在您的情况下为 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 对象。