是否有一种模式可以将这样的构造重构为可读的单行?
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
答案 0 :(得分:3)
@news = News.all_active.where(params[:section] == "all" ? nil : {:section => params[:section]})
您可以摆脱@news.all
- 在使用生成的ActiveRecord::Relation
对象时(例如,当您致电each
或first
时,将执行Rails 3查询)它)。将nil
传递给where
方法将无效。
如果all_active
是一种方法,您可以将其重构为范围,然后在链中调用它。
Rails 3查询的大量资源:
答案 1 :(得分: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也是范围,而不是结果集。