【发布时间】:2015-05-12 16:39:36
【问题描述】:
我们正在尝试为一个项目建立最佳实践,并且我们正在讨论应该将 SQL 和 ActiveRecord 方法放在哪里。
我的理解是,您希望尽可能多地保留控制器之外的逻辑。我认为我们同意属于模型的复杂 SQL 查询,但我们不同意简单的 AR 方法应该存在于何处,无论是在控制器中还是在模型中。
所以用一些简单的东西,比如:
client = Client.find(10)
理想情况下它会存在于模型或控制器中吗?我知道这可能没有太大/任何区别,答案也无所谓,但对这个问题的任何见解都会很棒。
【问题讨论】:
-
client = Client.find(10)是一个相当简单的操作,并且有点脱离上下文,所以我会说它可能会进入控制器或模型,具体取决于它执行的原因。在没有其他指导的情况下,我可能会说控制器。约定是控制器和视图对代码轻描淡写,代码在模型中(并在助手中查看帮助代码),但这是一个 约定 (不是绝对规则)原因是很多代码都与排序、筛选和处理数据有关,这与模型相关。控制器可以有一些代码。 :) -
这是一个从博客中读到的讨论:“复杂的查询(即,比简单的查找更复杂);一般来说,你不应该使用 where 方法,或者任何其他类似的查询构建方法,在模型类本身之外”。我现在才意识到他说 find 可以在控制器中使用,那么我认为 Client.where("first_name='Carly'") 应该在控制器之外使用呢?
-
对于
Client.where("first_name='Carly'"),我仍然会说这取决于(根据上下文)。 :) -
您能否就何时将其留在控制器中以及何时将其抽象为模型做出一般性断言?
-
我在想,如果它是在提供常用数据过滤器的上下文中,那将是模型。如果它被用作基于用户操作的选择器来指导视图中发生的事情,那么控制器。管制员就是交通警察(我从来不喜欢这个比喻,但我猜它在这里行得通)。
标签: ruby-on-rails ruby ruby-on-rails-3 activerecord