4

我对 MVC 的理解是 SQL(或任何与持久性相关的)查询只能在模型/控制器对象中执行。因此,关于控制器的 Rails 3 文档指出:

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

但是,文档也有直接在 View (HTML helper) 代码中使用查询的示例:

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

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

4

2 回答 2

6

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

我目前正在阅读Rails 反模式书,他们建议在模型中确定所有这些查询的范围。然后,控制器将有权访问模型中定义的方法,将结果暴露给视图。

但是,如果您不注意,您很快就会发现自己有胖模型,为了避免这种情况,您可以使用对这种模式有很大帮助的命名范围。另一个需要注意的关键规则是适用于 Rails的 Demeter 法则,这意味着一个模型不应该过多了解其他模型的实现细节。因此,如果有与关联模型相关的查询,您应该在此关联模型中进行范围。

最后,以下文章(由 Jamis Buck 撰写)(Skinny Controller,Fat Model)是该主题的好读物。

于 2012-05-02T16:20:30.960 回答
0

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

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

于 2012-05-02T21:21:00.690 回答