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 scope
s,您还可以考虑使用 finders 模型,它从模型和控制器中提取查询。
看看如何Gitlab handles it。
我真的认为这里的 "core" 原则是 DRY 和 KISS。
如果您有一个相对冗长的查询(多个 where
子句、join
等),而您的多个控制器需要将其提取为一个范围。
如果您有一个相当冗长的查询,似乎淹没了整个控制器方法,您可能应该将其提取为一个范围。
我们正在尝试为一个项目建立最佳实践,我们正在讨论 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 scope
s,您还可以考虑使用 finders 模型,它从模型和控制器中提取查询。
看看如何Gitlab handles it。
我真的认为这里的 "core" 原则是 DRY 和 KISS。
如果您有一个相对冗长的查询(多个 where
子句、join
等),而您的多个控制器需要将其提取为一个范围。
如果您有一个相当冗长的查询,似乎淹没了整个控制器方法,您可能应该将其提取为一个范围。