2015-05-12 129 views
1

我们正在尝试为项目建立最佳实践,并且我们正在讨论应该在何处放置SQL和ActiveRecord方法。Ruby on Rails ActiveRecord约定

我的理解是,你想保持尽可能多的逻辑控制器尽可能。我认为我们同意属于模型的复杂SQL查询,但我们不同意简单的AR方法应该在哪里存在,无论是在控制器还是在模型中。

因此,与喜欢的东西简单化:

client = Client.find(10) 

会是理想的生活在一个模型或控制器?我明白它可能没有太大的区别,答案也没有关系,但对这个问题的任何洞察力都会很大。

+3

'client = Client.find(10)'是一个相当简单的操作,并且有一点不在上下文中,所以我会说它可能会进入控制器或模型,具体取决于它的完成原因。没有其他指导,我可能会说控制器。约定是控制器和视图在代码上很简单,代码在模型中(并且在助手中查看帮助代码),但它是一个*规范*(并非绝对规则),这是有原因的,很多代码与排序,筛选和处理与模型相关的数据有关。控制器可以有*一些*代码。:) – lurker

+1

这是一个讨论,源自博客阅读:“复杂的查询(即比简单的查找更复杂);一般来说,你不应该使用where方法或任何其他查询构建方法喜欢它,在模型类本身之外“。 我刚才意识到他说的发现可以在控制器中使用,那么Client.where(“first_name ='Carly'”) 我认为这应该是在控制器之外? – CarlyL

+3

对于'Client.where(“first_name ='Carly'”)',我仍然会说*它取决于*(在上下文中)。 :) – lurker

回答

1

对此没有一个很好的答案,我有一种感觉,这可能会因此而关闭,但无论如何,这里无论如何。

Client.find(10)Client.where("first_name='Carly'")与您所能做的一样简单。你根本无法用模型方法替换第一个。第二我想你可以做一个search方法,但这可能为时过早。

我认为这些文章的一点是,你不希望在你的控制器是这样的:

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

这是一个名为范围非常明确的候选人(或他们夫妇)。

这就是说有些时候我会把它留在我的控制器中,因为它非常专用于控制器,并且不会在其他任何地方使用,因此在干扰它的时候没有太多的意义。

然而,大多数时候当你开始这样做时,你会意识到有一些常见的功能可以提取到你的模型中,所以你可以在别处使用它。

+0

我认为这是我们所寻找的核心。感谢您花时间回答! – CarlyL

1

除了类别scope s,您还可以考虑使用查找器模型,该模型从模型和控制器中提取查询。请看Gitlab handles it

+0

谢谢Andrey,我以前没有听说过发现者模型。这是一个有趣的概念,我很欣赏反馈。 – CarlyL

1

我真的认为这里的“核心”原则是DRY和KISS。

如果您有几个控制器所需的查询相对较长(几个where子句,join s等),请将其作为范围提取。

如果您有一个相当冗长的查询,看似压倒了整个控制器方法,您应该将其作为范围提取。

+0

谢谢艺术。我认为,我们应该如何处理简单和非简单的ActiveRecord方法并抽象出范围。 – CarlyL

+0

不客气@CarlyL。很高兴我能帮上忙。祝你好运! –

相关问题