2014-03-25 47 views
1

林堅持試圖找到一種方式來重構這個醜陋的控制器Rails的控制器重構DRY代碼

def video_games 
    @video_games_released = Item.video_games.released.group_by { 
    |item| [item.release_date.try(:strftime, "%B %d, %Y"), item.time_diff_components].join() 
    } 
    @video_games_coming_soon = Item.video_games.coming_soon.group_by { 
    |item| [item.release_date.try(:strftime, "%B %d, %Y"), item.time_diff_components].join() 
    } 
    @video_games_unknown = Item.video_games.unknown.group_by { 
    |item| [item.release_date.try(:strftime, "%B %d, %Y"), item.time_diff_components].join() 
    } 
end 

def movies 
    @movies_coming_soon = Item.movies.coming_soon.group_by { 
    |item| [item.release_date.try(:strftime, "%B %d, %Y"), item.time_diff_components].join() 
    } 
    @movies_released = Item.movies.released.group_by { 
    |item| [item.release_date.try(:strftime, "%B %d, %Y"), item.time_diff_components].join() 
    } 
    @movies_unknown = Item.movies.unknown.group_by { 
    |item| [item.release_date.try(:strftime, "%B %d, %Y"), item.time_diff_components].join() 
    } 
end 

def tv 
    @tv_coming_soon = Item.tv.coming_soon.group_by { 
    |item| [item.release_date.try(:strftime, "%B %d, %Y"), item.time_diff_components].join() 
    } 
    @tv_released = Item.tv.released.group_by { 
    |item| [item.release_date.try(:strftime, "%B %d, %Y"), item.time_diff_components].join() 
    } 
    @tv_unknown = Item.tv.unknown.group_by { 
    |item| [item.release_date.try(:strftime, "%B %d, %Y"), item.time_diff_components].join() 
    } 
end 

我想擺脫重複的espcially我GROUP_BY方法

我試着去到模型和創建方法

def group_by_month 
    self.group_by { 
    |item| [item.release_date.try(:strftime, "%B %d, %Y"), item.time_diff_components].join() 
    } 
end 

香港專業教育學院試圖劃定範圍,但似乎沒有任何合作

我不是軌專家,真的想學習如何重構代碼,並保持乾燥的事情

回答

1

您可以使用groupupdate寶石 它會給你在數據庫級別上

這是最簡單的方式這個功能

如果你想這樣做的方式更多地瞭解軌道

您有使用一遍又一遍

一個明顯的塊
{ 
    |item| [item.release_date.try(:strftime, "%B %d, %Y"), item.time_diff_components].join() 
    } 

,你可以將它保存和調用它,當你需要它

date_group = lambda { |item| [item.release_date.try(:strftime, "%B %d, %Y"), item.time_diff_components].join()} 

,當你需要使用它,你可以做

Item.tv.coming_soon.group_by(&date_group) 

您可能希望保存此塊在一些地方你可以很容易地訪問

+0

這是一個很好的建議......但有沒有簡單的方法來重構這個?感謝寶石上的頭銜,儘管...我想知道是否有一種很好的方式來重構此代碼而不使用寶石。只是爲了學習目的...謝謝! – user1502223

+0

爲更多的澄清添加更多的意見 –

+0

謝謝多數民衆贊成在我正在尋找...什麼與在date_group(&date_group)前面的& – user1502223

2

所以我做了什麼重構這個代碼與khaled_gomaa的建議幫助是

我創建了一個主持人在

app/presenters/items/index_presenter.rb 

module Items 
class IndexPresenters 
    def initialize(item) 
    @item = item 
    end 

    def released 
    @item.released.group_by(&date_group) 
    end 

    def coming_soon 
    @item.coming_soon.group_by(&date_group) 
    end 

    def unknown 
    @item.unknown.group_by(&date_group) 
    end 

    def date_group 
    lambda { |item| [item.release_date.try(:strftime, "%B %d, %Y"), item.time_diff_components].join()} 
    end 
end 
end 

然後在我的控制器

def video_games 
    @presenter = Items::IndexPresenters.new(Item.video_games) 
end 

def movies 
    @presenter = Items::IndexPresenters.new(Item.movies) 
end 

def tv 
    @presenter = Items::IndexPresenters.new(Item.tv) 
end 

和我的看法

%h2 Movies Released 
= render 'items', item: @presenter.released 
%h2 Movies Coming Soon 
= render 'items', item: @presenter.coming_soon 
%h2 Movies Unknown 
= render 'items', item: @presenter.unknown 

任何進一步的建議,將受到歡迎!謝謝!