亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
最近訪問板塊 發(fā)新帖
查看: 3540 | 回復(fù): 5
打印 上一主題 下一主題

Rails sql延遲加載和自帶緩存 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2011-01-11 13:28 |只看該作者 |倒序?yàn)g覽
Rails sql延遲加載和自帶緩存


Ruby代碼

  1. color_lot_manuallies = color_lot.color_lot_manuallies   
  2. if color_lot_manuallies.size == 1   
  3. end  
復(fù)制代碼
引用
  1. SELECT count(*) AS count_all FROM `color_lot_manuallies` WHERE (`color_lot_manuallies`.color_lot_id = 237)
復(fù)制代碼
當(dāng)有A has many B時(shí),a.bs.size并不是檢索出所有a.bs再求出size,而是直接用select count(*)來計(jì)算結(jié)果。這應(yīng)該是延遲加載,有點(diǎn)類似named_scope,但是并不是named_scope,named_scope的結(jié)果類是ActiveRecord::NamedScope::Scope,但是A.bs.class的結(jié)果是Array,這部分看了下源碼但是并沒有看懂。
所以當(dāng)我這樣寫的時(shí)候:

Ruby代碼
  1. color_lot_manuallies = color_lot.color_lot_manuallies   
  2. if color_lot_manuallies.size == 1   
  3. end  
  4. color_lot.color_lot_manuallies.each do |i|   
  5.    puts i.id   
  6. end  
復(fù)制代碼
引用
  1. SQL (0.6ms)   SELECT count(*) AS count_all FROM `color_lot_manuallies` WHERE (`color_lot_manuallies`.color_lot_id = 200)
  2. ColorLotManually Load (0.1ms)   SELECT * FROM `color_lot_manuallies` WHERE (`color_lot_manuallies`.color_lot_id = 200)
復(fù)制代碼
這樣的話rails使用了延遲加載造成兩個(gè)sql不同,所以后面。color_lot.color_lot_manuallies再次使用時(shí),不會(huì)使用緩存的sql。
改成這樣:


Ruby代碼
  1. color_lot_manuallies = color_lot.color_lot_manuallies.all   
  2. if color_lot_manuallies.size == 1   
  3. end  
  4. color_lot.color_lot_manuallies.each do |i|   
  5.    puts i.id   
  6. end  
復(fù)制代碼
引用
  1. ColorLotManually Load (0.1ms)   SELECT * FROM `color_lot_manuallies` WHERE (`color_lot_manuallies`.color_lot_id = 198)
  2. CACHE (0.0ms)   SELECT * FROM `color_lot_manuallies` WHERE (`color_lot_manuallies`.color_lot_id = 198)
復(fù)制代碼
加一個(gè)all,color_lot.color_lot_manuallies.all,這樣的話,后面再次調(diào)用時(shí),會(huì)使用rails的sql緩存。


Ruby代碼
  1. #PurchaseOrder   
  2.   has_one :purchase_order_marketing, :dependent => :destroy  
  3.   has_many :purchase_invoices, :dependent => :destroy,:through => :purchase_order_marketing  
  4. #PurchaseOrderMarketing   
  5.   has_many :purchase_invoices,:dependent => :destroy  
  6.   
  7. PurchaseOrder.first.purchase_invoices.all(:select => 'purchase_invoices.id')
復(fù)制代碼
引用
  1. PurchaseOrder Load (0.2ms)   SELECT * FROM `purchase_orders` LIMIT 1
  2.   PurchaseInvoice Load (0.8ms)   SELECT purchase_invoices.id FROM `purchase_invoices` INNER JOIN `purchase_order_marketings` ON `purchase_invoices`.purchase_order_marketing_id = `purchase_order_marketings`.id WHERE ((`purchase_order_marketings`.purchase_order_id = 13))
復(fù)制代碼
一條sql就完成了,真強(qiáng)大。

Ruby代碼
  1. #article   
  2. f sizes   
  3.   sizes = []   
  4.   art = self  
  5.   sf = art.article_secondary_feature   
  6.   size_group = SizeGroup.find_by_id(sf.size_groupid) if sf   
  7.   sizes = size_group.sizes if size_group   
  8.   return sizes   
  9. end  
復(fù)制代碼
Ruby代碼
  1. ArticleMarketing.first.article.sizes.all(:select => 'id')
復(fù)制代碼
引用
  1. ArticleMarketing Load (0.3ms)   SELECT * FROM `article_marketings` LIMIT 1
  2.   Article Load (0.8ms)   SELECT * FROM `articles` WHERE (`articles`.`id` = 43)
  3.   ArticleSecondaryFeature Load (0.7ms)   SELECT `article_secondary_features`.* FROM `article_secondary_features` WHERE (`article_secondary_features`.article_id = 43)
  4.   SizeGroup Load (0.6ms)   SELECT * FROM `size_groups` WHERE (`size_groups`.`id` = 2) LIMIT 1
  5.   Size Load (1.0ms)   SELECT id FROM `sizes` WHERE (`sizes`.size_group_id = 2)
復(fù)制代碼
find和find_by_id


Ruby代碼
  1. params[:root].classify.constantize.find_by_id(params[:id])   
  2. params[:root].classify.constantize.find(params[:id])  
復(fù)制代碼
引用
  1. Opportunity Load (0.1ms)   SELECT * FROM `opportunities` WHERE (`opportunities`.`id` = '126') LIMIT 1
  2. Opportunity Load (0.1ms)   SELECT * FROM `opportunities` WHERE (`opportunities`.`id` = 126)
復(fù)制代碼
find_by_id的SQL多了一行l(wèi)imit 1,對(duì)于sql語句而言,有一點(diǎn)性能上的提高。不過有時(shí)候我們需要find來捕捉異常。如果能用find_by_id最好了。
都改成find_by_id

引用
  1. Opportunity Load (0.1ms)   SELECT * FROM `opportunities` WHERE (`opportunities`.`id` = '126') LIMIT 1
  2.   CACHE (0.0ms)   SELECT * FROM `opportunities` WHERE (`opportunities`.`id` = '126') LIMIT 1
復(fù)制代碼
這樣都有緩存了。rails的自帶的緩存是很脆弱的,B.find_by_id(a.id)方法變成a.b時(shí),這個(gè)緩存就不會(huì)用上。同樣前面的例子里改成


Ruby代碼
  1. color_lot_manuallies = color_lot.color_lot_manuallies.all   
  2. ColorLotManually.find_all_by_color_lot_id(color_lot.id)  
復(fù)制代碼
rails自帶的緩存也不會(huì)用上。
關(guān)于||=緩存,參考
http://fuliang.javaeye.com/blog/827321
http://www.javaeye.com/topic/810957
但是有一點(diǎn),||=不會(huì)自動(dòng)清除或者更新,所以使用的時(shí)候還是要注意點(diǎn),可能會(huì)引起取值錯(cuò)誤,而且不會(huì)報(bào)錯(cuò)。


Ruby代碼
  1. class PortOfDischage < ActiveRecord::Base   
  2.   def _name   
  3.     @_name ||= self.city   
  4.   end  
  5. end  
復(fù)制代碼
Ruby代碼
  1. Reloading...   
  2. => true  
  3. >> p=PortOfDischage.first   
  4.   SQL (0.2ms)   SET SQL_AUTO_IS_NULL=0   
  5.   PortOfDischage Load (21.2ms)   SELECT * FROM `port_of_dischages` LIMIT 1   
  6.   PortOfDischage Columns (1.7ms)   SHOW FIELDS FROM `port_of_dischages`   
  7. +----+------------+-----------------+---------+---------+--------------------------------+--------------------------------+   
  8. | id | ap_list_id | ap_marketing_id | city    | country | created_at                     | updated_at                     |   
  9. +----+------------+-----------------+---------+---------+--------------------------------+--------------------------------+   
  10. | 1  | 2          | 2               | Piraeus | Greece  | Thu Oct 07 07:10:21 +0800 2010 | Thu Oct 07 07:10:21 +0800 2010 |   
  11. +----+------------+-----------------+---------+---------+--------------------------------+--------------------------------+   
  12. 1 row in set   
  13. >> p._name   
  14. => "Piraeus"  
  15. >> p.update_attribute(:city,'p')   
  16.   SQL (0.2ms)   BEGIN  
  17.   ApMarketing Columns (43.0ms)   SHOW FIELDS FROM `ap_marketings`   
  18.   ApMarketing Load (18.6ms)   SELECT * FROM `ap_marketings` WHERE (`ap_marketings`.`id` = 2)   
  19.   PortOfDischage Update (45.5ms)   UPDATE `port_of_dischages` SET `updated_at` = '2010-12-30 13:08:47', `city` = 'p' WHERE `id` = 1   
  20.   SQL (55.5ms)   COMMIT   
  21. => true  
  22. >> p._name   
  23. => "Piraeus"  
  24. >> p.city   
  25. => "p"  
  26. >> p.reload   
  27.   PortOfDischage Load (0.7ms)   SELECT * FROM `port_of_dischages` WHERE (`port_of_dischages`.`id` = 1)   
  28. +----+------------+-----------------+------+---------+--------------------------------+--------------------------------+   
  29. | id | ap_list_id | ap_marketing_id | city | country | created_at                     | updated_at                     |   
  30. +----+------------+-----------------+------+---------+--------------------------------+--------------------------------+   
  31. | 1  | 2          | 2               | p    | Greece  | Thu Oct 07 07:10:21 +0800 2010 | Thu Dec 30 13:08:47 +0800 2010 |   
  32. +----+------------+-----------------+------+---------+--------------------------------+--------------------------------+   
  33. 1 row in set   
  34. >> p._name   
  35. => "Piraeus"  
復(fù)制代碼

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2011-01-11 13:35 |只看該作者
謝謝!

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2011-01-11 14:32 |只看該作者
謝謝!
2gua 發(fā)表于 2011-01-11 13:35



    ???為啥要謝啊

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2011-01-11 15:41 |只看該作者
回復(fù) 3# feiyang10086


    感謝你為Ruby版塊做貢獻(xiàn)啊。

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2011-01-11 15:57 |只看該作者
回復(fù) 4# 2gua


    客氣了!

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2011-01-11 16:01 |只看該作者
呵呵,感謝支持本版啊。
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP