Rails:使用关系查询或直接使用#where

时间:2017-06-09 14:31:50

标签: ruby-on-rails database ruby-on-rails-4 coldfusion

我来自UI / ColdFusion背景,对不起,如果我问一个愚蠢的问题。

假设我们有两个模型Book & Page,一本书有很多页面。 通常情况下,我看到rails devs执行以下操作,

book = Book.find(id)
pages = book.pages

确实执行了两个查询,一个用于获取书籍,一个用于获取页面。

我们可以这样写,

Add a class method to Page model. 
pages = Page.where(book_id: id)

这将执行一个查询但仍会返回结果。

但是,为什么开发人员更喜欢第一种方法而不是第二种方法。

2 个答案:

答案 0 :(得分:2)

这只是人们遵循的做法

通常,当您访问嵌套资源时会出现这种情况

book = Book.find(id)
pages = Page.where(book_id: id)

所以要确保你的书不仅仅是孤儿页

pages = Page.where(book_id: id)

然而,通过上述查询,即使书籍被删除,您也会获得这些页面,以防您没有页面dependent: :destroy

答案 1 :(得分:2)

从我的练习中,您的问题有2个答案,正确答案取决于开发人员的经验。

  1. 新手 - 因为这就是教程中的内容。我加入的第一个Rails团队有一个没有DB或SQL经验的首席开发人员。他不关心或不知道我们的代码生成的db服务器上的负载。这在Rails的早期非常普遍(根据我的经验)。 ActiveRecords让你很容易忘记你在背景中有一个DB而且很容易忘记。我自己来自java和php世界,我会问为什么我们只是编写一个SQL来加入并在服务器端进行繁重的工作。
  2. 经验丰富 - 经验丰富的开发人员为代码可读性而努力。因为从长远来看,维护可读代码的成本更低。如果您的监视工具显示您的数据库服务器开始出现压力,您可以随时对其进行分析和修复(垂直扩展,在架构的不同级别添加缓存等)。此外,在控制器中使用时,.find如果无法在数据库中找到记录,则会生成404页面。此外,如果您运行“自定义”sql,您将失去AR为您维护的“自动”模型 - 数据关系。所以,很多人选择这样做。
  3. 所以你去吧。除非您正在处理非常繁重的负载应用程序,否则最好以可读的方式编写。