ruby-on-rails - 根据多个条件将多个项目推送到数组的干净方法
问题描述
代码如下。
def call
banners = []
banners.push(banner1) if condition1?
banners.push(banner2) if condition2?
banners.push(banner3) if condition3?
banners
end
def banner1
{
type: BANNER1,
display_value: 'banner_1'
}
end
有没有更简洁的方法来写这个?可能是更少的代码行?
解决方案
不成为人类编译器的一种方法是使用循环:
def call
[:banner1, :banner2, :banner3].filter_map do |name|
send(name) if send("#{name}?")
end
end
这假定您要调用的方法的名称和预判方法之间存在某种相关性。
如果不使用哈希代替:
def call
{
banner1: :condition1?,
banner2: :condition2?,
banner3: :condition3?
}.filter_map do |method, condition|
send(method) if send(condition)
}
end
当然,这确实引出了一个问题,这些方法是否可以通过 DRY:ed 变成一个带参数的方法,或者是否需要其他重构。
推荐阅读
- java - 两个线程进入一个同步块
- reactjs - React Apollo Client Resolver 没有从缓存中接收数据
- json - Delphi RestRequest 未授权 (401) 错误
- laravel - 如何使用获取数据从 vue 模板调用方法
- python - 'kedro' 不是内部或外部命令、可运行程序或批处理文件
- python - Python :- 如何将查询结果数据存储到数组中并通过索引号访问每个元素
- azure - 如何在逻辑应用程序中将参数值用于长字符串?
- javascript - 我想每 1 分钟在后台自动运行一次应用程序(我使用 TaskManager - Expo)
- r - R Dataframe - 查找与另一列中的值对应的列的值
- python - 解析数据框中的多个字典列以分隔列