是否有将ActiveRecord结果与API数据相结合的良好模式?

时间:2013-08-13 03:41:14

标签: ruby-on-rails ruby-on-rails-3 api activerecord data-structures

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

我有一组来自ActiveRecord的数据,我想将它与API中的数据集合并/组合。这两个数据集都有一个唯一的ID,它们之间很常见,因此我希望根据该ID进行合并,避免重复结果。

1 个答案:

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


干杯