我正在使用Ruby on Rails 4.1,Ransack和attr_encrypted。我有敏感数据存储在我的数据库中,我想使用gem attr_encrypted保护它。
正如我所料,在使用Ransack搜索加密的测试数据时,我得到的结果为零。
我尝试了以下解决方案,但它似乎对我不起作用。我的印象是加载函数用于返回解密值。
ReportsController
def index
@report_list = Report.all.load
@q = @report_list.search(params[:q])
@reports = @q.result(distinct: true).order('created_at DESC')
end
有没有人有搜索加密数据的经验,可以帮助我生成有效的解决方案吗?
答案 0 :(得分:1)
load将导致Active Record Collection执行查询并检索与您的查询匹配的结果(除了运行after_create回调,我相信这是你正在发生的解密之处)。
def index
#returns all records in DB
@report_list = Report.all.load
#I'm surprised these aren't throwing undefined method search of Array (or something similar)
@q = @report_list.search(params[:q])
@reports = @q.result(distinct: true).order('created_at DESC')
end
我想在此之前,我通常手动做这件事并且不熟悉attr_encrypted或Ransack,但我相信这些概念足够通用它们可以应用于任何设置。那么,关于你的问题,有两种可能性。
如果您可以搜索确切的值:
Model.where(encrypted_field: encrypt(params[:value])).first
其中encrypt是一种加密并返回传递的字符串的方法。
其次(痛苦地)
Model.all.delete_if{|m| !m.encrypted_field.include?(params[:value]) }
这将逐字地拉取,解密和扫描数据库中的每个条目。
我强烈建议不要这样做,但你需要做你需要做的事。
如果您绝对需要加密信息,但仍需要能够进行此类搜索。我强烈建议在模型中添加某种标签。这将允许您删除敏感信息,但仍然可以搜索某些属性。