程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Ruby on rails開發從頭來(四十七)- ActiveRecord基礎(強大的find方法)

Ruby on rails開發從頭來(四十七)- ActiveRecord基礎(強大的find方法)

編輯:關於JAVA

現在我們知道如何指定條件,現在我們來看看find方法支持的一些其他設置。

首先,理解find(:first,…)方法是非常重要的,該方法在同樣的conditions設置下,和find(:all,…)方法生成同樣的sql語句,不同之處僅在於只返回一條記錄。在調用的時候,一種的參數為:first,另一種為:all。

find方法執行一個select from這樣的sql語句,:all標記指定返回表中所有的記錄,:first返回第一條記錄。但是現在:first還不能保證你得到的就是表中的第一條記錄,原因是什麼?我們繼續往下看。

:conditions參數指定了SQL語句的where部分,可以包含Sql語句或者包含可以替換的參數的名字,值,上一篇我們已經做了了解。

daves_orders = Order.find(:all, :conditions => "name = 'Dave'")
name = params[:name]
other_orders = Order.find(:all, :conditions => ["name = ?", name])
yet_more = Order.find(:all,
:conditions => ["name = :name and pay_type = :pay_type",
params])

上面的find方法並不能保證按照特定的順序返回記錄,除非指定查詢的排序(order by)部分。:order參數就是用來指定SQL的排序條件的,下面的例子演示了查詢名字為Dave的訂單,並且按照pay_type,shipped_at字段進行降序排列。

orders = Order.find(:all,
:conditions => "name = 'Dave'",
:order => "pay_type, shipped_at DESC")

我們還可以設置:limit參數來限制返回的記錄數,如果你使用:limit參數,或許還想指定排序條件,下面的例子返回10條記錄,並且按照指定條件排序:

orders = Order.find(:all,
:conditions => "name = 'Dave'",
:order => "pay_type, shipped_at DESC",
:limit => 10)

參數:offset經常與:limit參數一同出現,用來指定從第一條記錄起,返回指定的偏移量,下面代碼演示了:offset參數的使用:

def Order.find_on_page(page_num, page_size)
find(:all,
:order => "id",
:limit => page_size,
:offset => page_num*page_size)
end

從上面的代碼可以看到,這樣使用find的場景就是分頁顯示數據,用pagesize指定每頁的記錄數,然後由pagenum*page_size指定從第幾條開始提取數據。

參數:join用來指定主表和哪些表進行關聯查詢,:join參數指定的部分會插入到SQL中,下面的代碼演示取得一個所有名為“Programing Ruby”的條目的列表:

LineItem.find(:all,
:conditions => "pr.title = 'Programming Ruby'",
:joins => "as li inner join products as pr on li.product_id = pr.id")

在後面的內容裡,我們還會了解更多的進行表關聯查詢的方法。

現在,我們在來回頭看看:all和:first參數,實際上在使用:first參數時,默認的帶有參數:limit,只不過:limit參數的值為1。如果你要取得最後一條記錄,只需要改變:order裡的排序方向為降序。

find方法為我們構建了完整的Sql查詢,而方法find_by_sql方法則允許我們對Sql有完整的控制,該方法只有一個參數,就是你想要使用的完整的sql語句,下面是示例代碼:

orders = LineItem.find_by_sql("select line_items.* from line_items, orders " +
" where order_id = orders.id " +
" and orders.name = 'Dave Thomas' ")

現在有一個問題了,就是返回的Model對象中都包含有哪些屬性呢?我們使用attributes( ), attribute_names( ), and attribute_present?( )方法來確定在Model對象中都包含有哪些屬性,第一個返回一個hash,裡面是鍵值對,第二個返回屬性名的數組,第三個判斷Model對象中是否含有某個屬性,例如:

orders = Order.find_by_sql("select name, pay_type from orders")
first = orders[0]
p first.attributes
p first.attribute_names
p first.attribute_present?("address")

程序的結果:

{"name"=>"Dave Thomas", "pay_type"=>"check"}
["name", "pay_type"]
false

find_by_sql方法也可以用來創建包含有派生(derived)(注1)的Model對象,如果你使用了as XXX 這樣的sql來給派生字段一個別名,這個別名會作為Model中的屬性名,例如:

items = LineItem.find_by_sql("select *, " +
" quantity*unit_price as total_price, " +
" products.title as title " +
" from line_items, products " +
" where line_items.product_id = products.id ")
li = items[0]
puts "#{li.title}: #{li.quantity}x#{li.unit_price} => #{li.total_price}"

在find_by_sql方法中,我們一樣可以使用占位符來給Sql語句傳遞參數,例如:

Order.find_by_sql(["select * from orders where amount > ?",
params[:amount]])
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved