首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >元编程Ruby

元编程Ruby
EN

Stack Overflow用户
提问于 2014-08-08 08:10:30
回答 1查看 76关注 0票数 1

我有一段代码:

代码语言:javascript
复制
@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的。这是最好的选择吗?

编辑:我认为我拥有它,因为我可以做到:

代码语言:javascript
复制
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'}]
...

然后可以像这样查询:

代码语言:javascript
复制
@timesheets.each do |ts|
  row = []
  Fields.each do |f|
    row.append(ts[f].to_date)
  end
end

我遇到的两个问题是:

我如何处理'ts.task_link.project.client.name‘?

代码语言:javascript
复制
ts[task_link.project.client.name] 

是行不通的。

第二个问题:如何集成to_date、to_time等...?

EN

回答 1

Stack Overflow用户

发布于 2014-08-08 08:57:01

一定程度的抽象会让这一切变得简单得多。创建

RowEntry和行

封装数据格式知识的类和简单地询问每个条目的显示格式的类。我真的看不到任何需要的MetaProgramming。

这一行

代码语言:javascript
复制
sheet.add_row row, :style => [date_format, time_format, time_format, nil, nil, nil, nil, nil, nil, nil, nil, money_format, money_format, nil]

变成了

代码语言:javascript
复制
sheet.add_row row.entries, row.style

更多详细信息:

RowEntry本质上是一个同时记录值和显示样式的结构。

行是一个RowEntry对象数组,它知道如何从RowEntry对象中提取普通的值数组和普通的样式数组。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25194200

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档