2013-03-05 32 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