2010-10-12 66 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