我有这段代码:
@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等......?
答案 0 :(得分:1)
抽象级别会使这更加简单。创建
RowEntry和Row
封装数据格式知识的类,简单地询问每个条目的显示格式。我真的没有看到任何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本质上是一个记录值和显示样式的结构。
Row是一个RowEntry对象数组,它知道如何从RowEntry对象中提取纯数组值和纯数组样式。