如何在Rails应用程序中使用SHA1摘要格式化id列?

时间:2015-01-05 14:56:00

标签: ruby-on-rails-4 sqlite

不直接在表中保存SHA1摘要字符串。是否可以在select语句中格式化列?

例如(希望你知道我的意思):

@item = Item.where(Digest::SHA1.hexdigest id.to_s:'356a192b7913b04c54574d18c28d46e6395428ab')

1 个答案:

答案 0 :(得分:1)

不,不是你想要的方式。您正在使用的hexdigest方法在数据库级别不可用。您可以使用特定于数据库的功能。

例如:

Item.where("LOWER(name) = ?", entered_name.downcase)

LOWER()函数可供数据库使用,因此可以将name列传递给它。

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

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

    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个对象。