2010-10-12 99 views
0

有沒有一種模式可以將這樣的構造重構爲可讀的單行?Rails模型的常見重構模式

def show_section 
    @news = News.all_active 
    @news = @news.where(:section => params[:section]) unless params[:section] == "all" 
    @news = @news.all 
end 

我使用的Rails 3和Ruby 1.9.2

回答

3
@news = News.all_active.where(params[:section] == "all" ? nil : {:section => params[:section]}) 

可以擺脫@news.all - Rails中,當您使用生成的ActiveRecord::Relation對象(例如,當你調用3查詢將被執行其上有eachfirst)。通過nilwhere方法將無能爲力。

如果all_active是一種方法,您可以將它重構爲一個範圍,然後在鏈中調用它。

on Rails的3查詢大資源:

+0

建立一個新聞範圍是一個好主意,謝謝! – Fu86 2010-10-15 13:14:13

1

您可以打開where條款進入一個方法在您的新聞模式:

class News 
    def self.for_section(section) 
     where(section == "all" ? nil : {:section => section}) 
    end 
end 

然後在您的控制器,可以一起連鎖這一切就像這樣:

News.for_section(params[:section]).all_active 

當然,這是假設all_active也是一個範圍,而不是一個結果。

+0

非常感謝! – Fu86 2010-10-15 13:14:35