元编程Ruby

时间:2014-08-08 00:10:30

标签: ruby-on-rails ruby

我有这段代码:

@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等......?

1 个答案:

答案 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对象中提取纯数组值和纯数组样式。