组合来自不同位置的两个数据集的最佳方法是什么?
我有一组来自ActiveRecord的数据,我想将它与API中的数据集合并/组合。这两个数据集都有一个唯一的ID,它们之间很常见,因此我希望根据该ID进行合并,避免重复结果。
答案 0 :(得分:1)
由于您将这些数据统一起来用于显示目的,因此最好使用帮助程序为任何需要它的视图排列数据结构。
控制器:
@model_records = ARmodel.find_my_scope
@api_records = ApiGem.gather_users
助手:
def all_users
ar_prop_filter = [:username, :first_name, :last_name, :current_project]
api_prop_filter = ['ranking', 'postCount', 'username', 'first_name', 'last_name']
# reduce to your hashes
model_set = @model_records.map{|rec| ar_prop_filter.inject({}){|acc, f| acc[f] = rec.send(f)} }
api_set = @api_records.map{|rec| api_prop_filter.inject({}){|acc, f| acc[f.to_sym] = rec[f]} }
# add the API data to the AR data, using the AR key
model_set.map! do |m_rec|
api_set[m_rec[:username]].each do |k, v|
m_rec[k] = v
end
end
# add API data that is not represented in the AR data
model_set += api_set.reject{|k, v| model_set.keys.include? k}
return model_set
end
这种方法效率低下,并假设来源之间存在不同的数据,导致您需要退火或验证您的观点的差距
请记住考虑MVC模型的最佳实践 - 否则它会引发您为何会这样做的问题。
这主要是一个问题,因为活动记录对象不是简单的哈希。它是类的实例化,将数据合并到其中可能会导致意外结果。如果您使用库来访问和API,那么该库可能会将对象实例化 - 这可能会导致类似的问题。
如果你确实有一个案例要求按照描述做事,那么你可能最好将每个API和活动记录对象表示为哈希,然后.merge
将它们组合在一起。请记住,执行此操作时可能会发生密钥空间冲突,并丢失数据。
请记住,在转换为哈希时,您将无法使用简单且高效的方式将此数据保存回活动记录或API源。
干杯