Rails模型的常见重构模式

时间:2010-10-12 12:08:58

标签: ruby-on-rails ruby refactoring

是否有一种模式可以将这样的构造重构为可读的单行?

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

2 个答案:

答案 0 :(得分:3)

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

您可以摆脱@news.all - 在使用生成的ActiveRecord::Relation对象时(例如,当您致电eachfirst时,将执行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也是范围,而不是结果集。