1

我很困惑在哪裏使用'.find'以及在哪裏使用'where'。在執行查詢期間性能是否存在差異?。查找或在有效記錄查詢條件

例如:轉換後的現有查詢被如下使用.find:

FileOrFolder.find_by_fullpath(completePath, :select=>"id") - >

FileOrFolder.where(fullpath: completePath).select(:id).first 

Component.find(:first, :conditions=>["cluster_id = ? AND name = ?", cluster_id, key]) - >

Component.where(cluster_id: cluster_id, name: key).first 
+0

在性能上沒有差異 - 同樣的查詢,但更「得心應手」使用'where'因爲返回的ActiveRecord ::的關係(http://stackoverflow.com/questions/9574659/rails-where-vs-find) – MrYoshiji

+0

@MrYoshiji ...我已經通過這篇文章....沒有它談到查詢性能的權利... ..pls糾正我,如果我錯了 – Vinay

+0

你可以通過在你的控制檯'Component.where(id:1).first'和'Component.find(1)'中測試你自己來做,你會發現它產生了EXACT相同的查詢,並採取同一時間,因爲它們是...相同的查詢! – MrYoshiji

回答

7

這些都是等同的。你在這裏看到的是從AREL被合併之前的ActiveRecord查詢語法的演變。不過,舊式動態查找器仍然有效。

這句法是從ROR 2.x及更早使用動態查找器:

FileOrFolder.find_by_fullpath(completePath, :select=>"id") 

而這些都是多在ROR 3.X風格:

FileOrFolder.where(fullpath: completePath).select(:id).first 
Component.where(cluster_id: cluster_id, name: key).first 

,您上次例如使用find在任何情況下均有效。

Component.find(:first, :conditions=>["cluster_id = ? AND name = ?", cluster_id, key]) 

如有疑問,consult the ROR query guide

我個人發現,where樣式在您通過多行代碼構建查詢時並非全部都非常有用。由於他們推遲執行,直到最新的時刻,他們讓你建立零碎的查詢。

1

它不會使一個顯着的性能差異,因爲通常它們都會生成相同的SQL,例如:

Article.find_by_headline('foo') 
=> SELECT `articles`.* FROM `articles` WHERE `articles`.`headline` = 'foo' LIMIT 1 

Article.where(headline: 'foo').first 
=> SELECT `articles`.* FROM `articles` WHERE `articles`.`headline` = 'foo' LIMIT 1 
+0

所以你的意思是說...它只是一個語法差異總體.....因爲一些find_by_headline語法的類型被棄用,我們傾向於使用的地方......它是正確的嗎? – Vinay

+0

@Vinay,'find_by'不會被棄用,只是其他的變化。我的選擇是使用哪種語法對於當前的情況更加清晰和簡潔,並且領帶將轉到「where」。在實踐中我使用兩者。儘管如此,我認爲這比個性化的最佳實踐更符合個人美學。 – Mori