Rails 3视图中是否可以接受查询?

时间:2012-05-02 16:16:56

标签: ruby-on-rails ruby-on-rails-3 model-view-controller

我对MVC的理解是SQL(或任何与持久性相关的)查询应该只在Model / Controller对象中执行。因此,Rails 3 documentation about Controllers表示:

  

[控制器]使模型数据可供视图使用,以便它可以向用户显示该数据。

但是,该文档还提供了使用queries directly in View (HTML helper) code

的示例
select("post", "person_id", Person.all.collect {|p| [ p.name, p.id ] })
# Note the model query -----^

在Rails 3中,通常可以在Views中执行查询,还是有一个令人信服的理由将这些查询严格委托给Model或Controller对象?文档只是说明性的还是最佳实践的例证?

2 个答案:

答案 0 :(得分:6)

我认为这仅仅是示范性的,而且一般来说并不是一个很好的例子。它足够接近我们可以在PHP中找到的SQL Spaghettis代码。

我正在阅读Rails anti-patterns book,他们建议在模型中查找所有这些查询。然后,控制器可以访问模型中定义的方法,将结果公开给视图。

然而,如果你不注意,你可以很快发现自己有胖模型,为了避免你可以使用Named scopes对这种模式有很大帮助。要注意的另一个关键规则是应用于Rails的Law of Demeter意味着一个模型不应该对其他模型的实现细节了解太多。因此,如果存在与关联模型相关的查询,则应在此关联模型中进行范围调整。

最后,以下article(由Jamis Buck编写)( Skinny Controller,Fat Model )是一个很好的读物。

答案 1 :(得分:0)

在Views中执行查询通常是不可接受的,即使它们非常简单。为了避免使控制器变重,一个好的做法(正如文档所说)是创建一个Helper并将查询放在那里。

当然,如果你想重用查询,最好把它放在模型中,也许使用范围。