ruby-on-rails - 从两个数据源创建哈希的最优雅方式
问题描述
我有一个 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
有没有更优雅的方式来做到这一点?顺便说一句,这是在我的控制器中。
解决方案
通用方法,接受键列表作为参数:
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
推荐阅读
- reactjs - React-Bootstrap 1.0.0-beta.6 偏移和 Form Col 不起作用
- ios - 在多个collectionviewcells中添加tableview
- html - 如何修复桌面和移动设备之间不一致的占位符文本垂直对齐?
- generator - Redux Saga 如何解析数据
- mocking - C++ 模拟类 - 如何解决这个多重继承问题?
- sql - 将日期字段值插入 varcharfield 以及附加的硬编码文本
- python - 使用方差膨胀因子查找属性之间的多重共线性
- c - 在用户输入每个数组位置的值时对数组进行排序
- r - 如何从数据集中删除多个年月
- python - 使用 Mathplotlib.pyplot 不会显示 Scipy 插值网格数据