我有一段代码:
@timesheets.each do |ts|
row = [
ts.time_start.to_date,
ts.time_start.to_time,
ts.time_end.to_time,
ts.task_link.project.client.name,
ts.task_link.project.name,
ts.task_link.task.name,
ts.notes
]
row.pop(3) if !@time_report.show_money
sheet.add_row row, :style => [date_format, time_format, time_format, nil, nil, nil, nil, nil, nil, nil, nil, money_format, money_format, nil]
end现在,我希望用户能够自己设置顺序。我将创建一个包含所有可能值(以及匹配样式)的散列。但是我如何将其集成到这个过程中呢?我查找了一些关于元编程的信息,但似乎主要是关于define_method的。这是最好的选择吗?
编辑:我认为我拥有它,因为我可以做到:
Fields = [{'fieldname' => 'time_start', 'caption' => 'Date', 'type' => 'to_date', 'style' => 'date_format'},
{'fieldname' => 'time_start', 'caption' => 'Start', 'type' => 'to_time', 'style' => 'time_format'},
{'fieldname' => 'time_end', 'caption' => 'End', 'type' => 'to_time', 'style' => 'time_format'}]
...然后可以像这样查询:
@timesheets.each do |ts|
row = []
Fields.each do |f|
row.append(ts[f].to_date)
end
end我遇到的两个问题是:
我如何处理'ts.task_link.project.client.name‘?
ts[task_link.project.client.name] 是行不通的。
第二个问题:如何集成to_date、to_time等...?
发布于 2014-08-08 08:57:01
一定程度的抽象会让这一切变得简单得多。创建
RowEntry和行
封装数据格式知识的类和简单地询问每个条目的显示格式的类。我真的看不到任何需要的MetaProgramming。
这一行
sheet.add_row row, :style => [date_format, time_format, time_format, nil, nil, nil, nil, nil, nil, nil, nil, money_format, money_format, nil]变成了
sheet.add_row row.entries, row.style更多详细信息:
RowEntry本质上是一个同时记录值和显示样式的结构。
行是一个RowEntry对象数组,它知道如何从RowEntry对象中提取普通的值数组和普通的样式数组。
https://stackoverflow.com/questions/25194200
复制相似问题