Ruby 关于 Rails ActiveRecord 约定

Ruby on Rails ActiveRecord Conventions

我们正在尝试为一个项目建立最佳实践,我们正在讨论 SQL 和 ActiveRecord 方法应该放在什么地方。

我的理解是您希望将尽可能多的逻辑保留在控制器之外。我认为我们同意属于模型的复杂 SQL 查询,但我们不同意简单的 AR 方法应该存在的位置,无论是在控制器中还是在模型中。

所以像这样简单的东西:

client = Client.find(10)

它理想地存在于模型或控制器中吗?我知道这可能不会造成 much/any 差异,答案是无所谓,但对问题的任何见解都会很棒。

对此没有一个好的答案,我觉得这可能会因此而关闭,但无论如何还是要关闭。

Client.find(10)Client.where("first_name='Carly'") 是您可以进行的最简单的查询。您根本无法用模型方法替换第一个。第二个我想你可以制作一个 search 方法,但这很可能为时过早。

我认为这些文章的重点是您不希望在您的控制器中使用这样的东西:

Client.where("created_at > X").where("some_flag = true").order('created_at DESC')

这是命名范围(或其中几个)的一个非常明确的候选者。

也就是说,有时我会把它留在我的控制器中,因为它非常特定于该控制器并且不会在其他任何地方(永远)使用,所以恕我直言,干掉它没有多大意义。

但是,大多数时候,当您开始这样做时,您会发现可以将一些通用功能提取到您的模型中,以便您可以在其他地方使用它。

除了 class scopes,您还可以考虑使用 finders 模型,它从模型和控制器中提取查询。

看看如何Gitlab handles it

我真的认为这里的 "core" 原则是 DRY 和 KISS。

如果您有一个相对冗长的查询(多个 where 子句、join 等),而您的多个控制器需要将其提取为一个范围。

如果您有一个相当冗长的查询,似乎淹没了整个控制器方法,您可能应该将其提取为一个范围。