2011-07-13 38 views
1

我发现我可以以多种方式做Model.find找到一个模型的最有效的方法(假设@user是用户模型的一个实例):通过ID用Model.find

User.find(2) 
=> #<User id: 2, name: "Mike Swift", email: "[email protected]", ... etc ... 

OR

User.find(@user) 
=> #<User id: 2, name: "Mike Swift", email: "[email protected]", ... etc ... 

OR

User.find(@user[:id]) 
=> #<User id: 2, name: "Mike Swift", email: "[email protected]", ... etc ... 

OR

User.find(@user.id) 
=> #<User id: 2, name: "Mike Swift", email: "[email protected]", ... etc ... 

后面三种方法之间有没有真正的区别? (我已经知道User.find(n)会是最快的)我会想象他们都在同一时间工作,但也许我错了。

回答

4

在sql方面他们都做同样的事情。

User.find(2) 

这将是最快的,因为不需要转换。

然后User.find(@user.id)User.find(@user[:id])

最后,因为rails需要将用户转换为ID,所以最后是User.find(@user

+0

我刚更新了这个问题。我已经知道'User.find(n)'是最快的。 '@ user.id'和'@user [:id]'有什么区别? – Swift

+1

@ user.id表示“调用用户的方法ID”。 AR为您制定该方法。您可以覆盖该方法。 @user [:id]表示“用1个参数(:id)”调用用户的[]方法“。 AR使它与@ user.id一样,但是你可以重写[]方法。 –

0

User.find(2)应该更快,因为Rails不需要做任何工作来找出id。其他人需要一定程度的消息传递才能获得该ID。

虽然我怀疑差异是非常显着的。

你可以尝试所有这些,看看你的日志,看看需要多长时间才能得到你的回应。

+0

我其实已经知道'User.find(2)'是最快的。我的意思是后三个选项之间的最快速度。我会澄清这个问题。 – Swift