2013-03-05 105 views
1

我很困惑这一个。我有几个可行的解决方案,但我不喜欢他们中的任何一个。现在的问题是,我正在尝试在Rails应用程序中生成CSV。特别是在我的应用程序中,我有很多值,大约是30.我希望显示的许多值也都在关联上,因此使行更长......他们看起来像这样(不要麻烦阅读,只是想让你有什么我谈论)的一个想法:红宝石风格提示:避免评估,并保持清晰有序

[piece.client.organization, piece.client.category, piece.client.name , piece.campaign.name, piece.name, piece_url(piece.id), piece.campaign.election_date, piece.campaign.win_loss, piece.final_date, piece.local_photos, piece.killed, piece.format_list, piece.artist_list, piece.partner_list, piece.account_executive_list, piece.out_of_stock, piece.total_intake, piece.campaign.candidate_tags, piece.client.spec_list, piece.campaign.mail_poll]

除了他们甚至更长的时间和更笨重。他们工作,但他们让我感到内心不好。这是当我有这个想法,我只想把它们放在一个二维数组,它立即作出的数据看起来更可读:

[["Client",  piece.client.organization], 
["Category",  piece.client.category], 
["Client Name", piece.client.name] , 
... 
["Campaign Name", piece.campaign.name], 
["Piece Name", piece.name]] 

这是伟大的,现在就可以在它循环来创建我的CSV行...但是,它会根据我需要定义它的位置炸毁,因为我的“片”未定义。那么,我想......如果我只是在引用中包含第二个参数并在稍后需要它们时调用eval,那该怎么办?然后,我看着它,人们似乎在说使用eval只有救人......

谁能想到一个简单的方法来保持所有的列名配对我的数据,但也许不是使用eval?或者,也许建议这将是一个很好的eval用例?

+1

我敢肯定'eval'从来没有救过一命,并可能危及一对夫妇。 :) – cHao 2013-03-05 21:00:21

+0

@counterbeing我使用完全相同的风格来创建一个csv。您可以通过跳过每对内部内部支架来进一步整理它。然后,在大数组的末尾添加'] .in_groups_of(2)'。 – Anil 2013-08-08 00:45:16

回答

3

您通常可以通过使用块,而不是避免eval。例如,在方法方面重新定义你的结构要求:

columns = [ 
    [ "Client", lambda { |piece| piece.client.organization } ], 
    [ "Category", lambda { |piece| piece.client.category } ], 
    # ... 
] 

然后遍历你的块时,做这样的事情:

pieces.each do |piece| 
    spec.each do |label, proc| 
    value = proc.call(piece) 

    # ... Do whatever you need here 
    end 
end 

定义块(PROC内部)可以帮助确定方法在推迟变量绑定到未来的某个点时做事。

eval有是很危险的,因为它可以执行任何的声誉。除非没有别的办法,否则最好避免它。

+0

尼斯和完整的答案。非常感谢你。所有这些lambda块仍然使事情看起来有点混乱,但我会说比我有更好的东西。我现在正在尝试使用stabby lambda语法' - >'(lambda对我来说仍然有些抽象,但我明白了)。再次感谢!我会标记你的答案,除非稍后有更简洁的内容出现。再次感谢tadman! – counterbeing 2013-03-05 21:22:52

+1

太棒了,好吧,我认为这个工作很好。我想补充一点,声明lambda表达式的stabby语法使我的眼睛更容易一些,现在看起来像这样:'[“Campaign”, - > campaign {campaign.name}]' – counterbeing 2013-03-05 21:32:51