查询在Rails 3视图中可以接受吗?

问题描述:

我对MVC的理解是SQL(或任何与持久相关的)查询只能在模型/控制器对象中执行。因此,Rails 3 documentation about Controllers指出:查询在Rails 3视图中可以接受吗?

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

然而,该文档还具有使用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,是通常可接受的,以查看执行查询或者是有令人信服的理由严格委派这种查询到模型或控制器对象?文件是否仅仅是示范性的,还是它是一个最佳实践的例证?

我认为这只是示范,并不是一个很好的例子。它足够接近我们可以在PHP中找到的SQL Spahettis代码。

我现在正在阅读Rails anti-patterns book,他们建议对模型中的所有查询进行范围划定。然后控制器将访问模型中定义的方法,将结果公开给视图。

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

最后,以下article(由Jamis Buck编写)(Skinny Controller,Fat Model)是一篇很好的关于这个主题的文章。

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

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

+1

但是,在视图中主要(完全?)不是使用助手吗?如果我们把一个查询放在助手中,那么和在View中做查询不是一回事吗? – maerics

+0

我明白了,我的观点是避免直接把它放在视图中,并证明文件是正确的。我用来从单个表a.i中提取简单的数据。创建包含项目列表的组合框的助手。 –