组合来自不同位置的两个数据集的最佳方法是什么?
我有一组来自 ActiveRecord 的数据,我想将其与来自 API 的数据集合并/组合。两个数据集都有一个唯一的 ID,这在它们之间是通用的,所以我想基于该 ID 进行合并并避免重复的结果。
组合来自不同位置的两个数据集的最佳方法是什么?
我有一组来自 ActiveRecord 的数据,我想将其与来自 API 的数据集合并/组合。两个数据集都有一个唯一的 ID,这在它们之间是通用的,所以我想基于该 ID 进行合并并避免重复的结果。
由于您将这些数据统一用于显示目的,因此最好使用帮助器为需要它的任何视图安排数据结构。
控制器:
@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 源。
干杯