首页 > 解决方案 > 从两个数据源创建哈希的最优雅方式

问题描述

我有一个 building_table 和 api::building_table,我希望将 building_table 中的数据作为默认值,但如果 building_table 中不存在数据,我想在 api::building_table 中获取它。问题是 building_table 中可能不存在但 api building_table 中存在的属性。每个表中还有不同名称的列。

这是我的示例代码

def get_building_info
  building = Building.find_by(id: params[:id])
  api_building = Api::Building.find_by(id: params[:id])
  building_hash = {}
  building_hash[:name] = building.name || api_building.name
  building_hash[:room] = building.room || api_building.room
  building_hash[:rent] = building.rent || api_building.monthly_fee
...
end

有没有更优雅的方式来做到这一点?顺便说一句,这是在我的控制器中。

标签: ruby-on-railsrubyruby-on-rails-4

解决方案


通用方法,接受键列表作为参数:

def get_building_info(keys = %i[name room rent].zip(%i[name room fee]))
  building = Building.find_by(id: params[:id])
  api_building = Api::Building.find_by(id: params[:id])
  keys.map do |key, api_key|
    [
      key,
      building.attributes[key.to_s] || api_building.attributes[api_key.to_s]
    ]
  end.to_h
end

推荐阅读