有没有一种模式可以将这样的构造重构为可读的单行?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
有没有一种模式可以将这样的构造重构为可读的单行?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
@news = News.all_active.where(params[:section] == "all" ? nil : {:section => params[:section]})
可以摆脱@news.all
- Rails中,当您使用生成的ActiveRecord::Relation
对象(例如,当你调用3查询将被执行其上有each
或first
)。通过nil
到where
方法将无能为力。
如果all_active
是一种方法,您可以将它重构为一个范围,然后在链中调用它。
on Rails的3查询大资源:
您可以打开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也是一个范围,而不是一个结果。
非常感谢! – Fu86 2010-10-15 13:14:35
建立一个新闻范围是一个好主意,谢谢! – Fu86 2010-10-15 13:14:13