2

我是比较新的轨道。我明白,rails可以让你轻松地使用数据库值,但是我对盲目使用哪种方法在数据库上更节能,哪些方法不是更加节能。Rails的最小化数据库装载

这是一个很好的例子。我有一个belongs_to用户的模型约会。在我的语法中,我有时可以说process_user @appointment.user当我编写它时,它是否对数据库运行单独的SELECT查询以检索该用户?它是更有效的写process_user @appointment.user_id其中user_id是在约会的属性,然后尝试使用user_id的值,只要执行我的评价相关的任务,因为我并不需要整个用户对象@appointment.user

坦率地说,从心态平和的角度来看,我只是喜欢能够使用process_user @appointment.user,因为它更好看,看起来更好,在准备逻辑时效果更好。这是一种性能高效的方式吗?

+0

如果您是新的轨道不开始让自己在纠结了效率。 Rails并不是最快或者最有效的框架,但是它的好处是它很容易使用并为你做了很多工作。如果你需要优化,那么稍后再做。 – thomasfedb

回答

1

您是使用像process_user @appointment.user代码完全正常,因为ActiveRecord的会尽可能减少数据库查询的次数。当然,它并不能完美地处理所有的情况,但你的例子是一个非常基本的例子。可能不会立即发生数据库查询,只有在访问其属性时才会加载该对象。

如果您发现在运行大型应用程序性能问题,你可以跟踪下来的问题用分析的ActiveRecord来,它可能是时间来优化。试图从一开始就进行预优化将违反Rails的理念,并且只会导致丑陋(甚至可能更慢)的代码。请记住,真正的性能瓶颈往往出现在你永远无法期待的地方。

编辑:正如温菲尔德指出的那样,优化查询次数通常并不意味着自己管理外键或类似的内部事件。数据库访问方法有许多标志和选项,可以让你控制数据库的查询方式。

1

您可以用热切您的预约模型加载您的相关用户:

Appointment.all(:include => :user) 

...这将在用户加入或者在单个查询所有相关的用户做一个单独的查询。

然后,它会提前(急切地)加载用户关联,以便在引用它时用户属性已经被对象填充,而不必停止并执行单独的查询以逐个查找(N +1查询)。