數據庫上最常運行的查詢莫過於根據指定條件返回符合的結果集,查詢可能是返回所有名字為‘dave’的訂單,或者是某個博客上所有標題含Rails的post,在很多其他的框架和程序設計語言中,你需要創建sql來執行查詢,Active Record利用了ruby語言所包含的動態能力來做這些事。
例如,我們的Order Model包含了諸如name,email,address這樣的屬性,我們可以使用這些名字對應的find方法來查詢,例如:
order = Order.find_by_name("Dave Thomas") orders = Order.find_all_by_name("Dave Thomas") order = Order.find_all_by_email(params['email'])
如果你調用了一個Model類的find_by_或者find_all_by_這樣字符串打頭的格式的方法,Active Record將它們轉換成一個查詢器(finder),而將方法後面的字符串作為字段名轉換find方法的參數,例如:
order = Order.find_by_name("Dave Thomas", other args...)
上面的調用等效的轉換為:
order = Order.find(:first, :conditions => ["name = ?", "Dave Thomas"], other_args...)
類似的,調用一個find_all_by_xxx方法相當於調用find(:all,… )方法。
到這裡魔術還沒有停止,Active Record還可以對多個列創建查詢器(finder),例如,你可以寫:
user = User.find_by_name_and_password(name, pw)
相當於:
user = User.find(:first, :conditions => ["name = ? and password = ?", name, pw])
為了確定要檢查哪些字段,Active Record簡單的分割find_by_和find_all_by_後面的字符串,這在大多數情況下是夠用的,除非你的根本就沒有某個在方法名中包含的字段。
注意,Active Record並不提供在find_by_或find_all_by後面的兩個字段名中含有_or_。