2

组合来自不同位置的两个数据集的最佳方法是什么?

我有一组来自 ActiveRecord 的数据,我想将其与来自 API 的数据集合并/组合。两个数据集都有一个唯一的 ID,这在它们之间是通用的,所以我想基于该 ID 进行合并并避免重复的结果。

4

1 回答 1

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 源。


干杯

于 2013-08-13T04:55:31.217 回答