201705 Ruby基础拾遗
- Mixin
- override
- 异常处理
- super 与super()
- 使用%()处理需要string interpolation但同时也需要" "(double quote)的状况
- 当要宣告一个拥有多字串的Array 阵列时,偏好使用%w
- 大数据情况下
- 1. 尽量避免使用ActiveRecord Object
- 2. 有 update_all 可以用,少用 for / each
- 3.不要直接使用Post.all.each,可以用 find_in_batches
- 4. 批量修改数据记录时,使用transaction 跳过每次的 BEGIN COMMIT 过程
- 5.使用 update_column / sneacky-save 而非原生 save
- 6.可以的话使用 Post.select("column 1, colum2").where("id < 10"), 代替Post.where("id < 10")
- 7. 使用 delegate 把大字段搬出去,独立成表
- 8. 添加索引INDEX,避免索引过长
- 9. delete / destroy的时间成本
- 10. 无法避免的耗时操作丟到 background job 去操作。
- 结论:当数据量大到一定程序,请尽量使用原生sql
Mixin
- Mixin include: 作为实例方法引入
- extend : 作为类方法引入
- Inheritance(继承)
override
ruby class內的method都是可以被修改、添加定义的。
修改影响所有实例,包括修改操作前创建的实例。异常处理
begin
# 可能會發生例外的 code
rescue AExceptionClass => some_variable
# 屬於 AExceptionClass 的例外發生時 run 這段 code
rescue BExceptionClass => some_other_variable
# 屬於 BExceptionClass 的例外發生時 run 這段 code
else
# 都沒有例外發生時 run 這段 code
ensure
# 無論有沒有發生例外,都會 run 這段 code
end
def foo
# 正常時的處理
rescue
# 發生例外時的處理
end
super 与super()
- super:呼叫父类别的同名函式,并且将本函式的所有参数传入父类别的同名函式。
- super(): 带括号则表示呼叫父类别的同名函式,但是不传入任何参数。
使用%()处理需要string interpolation但同时也需要" "(double quote)的状况
<%= "<div class=\"name\"> #{name} </div>" %>
<%= "<div class='name'> #{name} </div>" %>
<%= %(<div class="name">#{name}</div>) %>当要宣告一个拥有多字串的Array 阵列时,偏好使用%w
array = ["A", "B", "C", "D"] array = %w(A B C D)
Rails
大数据情况下
1. 尽量避免使用ActiveRecord Object
ActiveRecor,rake task在大数据量下运行是非常慢的,应该直接使用sql语句进行数据操作
2. 有 update_all 可以用,少用 for / each
posts = Post.where(:board_id => 5)
post.each do |post|
post.board_id = 1
post.save
end
当数据量达到十万条时,一天也跑不完 Rails 提供了 update_all 可以用,相当于直接使用sql的效果
Post.update_all({:board_id => 1}, {:board_id => 5})
3.不要直接使用Post.all.each,可以用 find_in_batches
如果十万笔数据加载到内存,估计超过10G,程序可能直接闪退
Post.find_in_batches(:conditions => "board_id = 5", :batch_size => 1000) do |posts|
posts.each do |post|
post.board_id = 1
post.save
end
end
4. 批量修改数据记录时,使用transaction 跳过每次的 BEGIN COMMIT 过程
Post.find_in_batches(:conditions => "board_id = 5", :batch_size => 1000) do |posts|
Post.transaction do
posts.each do |post|
post.board_id = 1
post.save
end
end
end
5.使用 update_column / sneacky-save 而非原生 save
save 存储资料时,会调用一堆 validator 和 callbacks
update_column / sneacky-save会跳过,直接修改数据库字段,区别是update_column一次只能修改一个字段,后者可修改多个字段。6.可以的话使用 Post.select("column 1, colum2").where("id < 10"), 代替Post.where("id < 10")
7. 使用 delegate 把大字段搬出去,独立成表
class Post < ActiveRecord::Base
has_one :meta after_create :create_meta deleagte :content, :to => :meta
end
8. 添加索引INDEX,避免索引过长
避免直接对varchar(255) 加索引
ALTER TABLE post DROP INDEX PTitle, ADD INDEX(PTitle(13));9. delete / destroy的时间成本
- destroy 刪除资料并callbacks
- delete 刪除资料,不callbacks
- destroy_all 和 delete_all 也类似
Mysql提供TRUNCATE TABLE清空表
delete_all不触发callback,但是会update index,所以相比TRUNCATE TABLE会很慢
TRUNCATE TABLE
ActiveRecord::Base.connection.execute("TRUNCATE TABLE #{table_name}")
10. 无法避免的耗时操作丟到 background job 去操作。
- delayed_job (不推荐)
- resque
- sidekiq
结论:当数据量大到一定程序,请尽量使用原生sql
201705 Ruby基础拾遗的更多相关文章
- 基础拾遗------redis详解
基础拾遗 基础拾遗------特性详解 基础拾遗------webservice详解 基础拾遗------redis详解 基础拾遗------反射详解 基础拾遗------委托详解 基础拾遗----- ...
- 基础拾遗------webservice详解
基础拾遗 基础拾遗------特性详解 基础拾遗------webservice详解 基础拾遗------redis详解 基础拾遗------反射详解 基础拾遗------委托详解 基础拾遗----- ...
- 基础拾遗-----mongoDB操作
基础拾遗 基础拾遗------特性详解 基础拾遗------webservice详解 基础拾遗------redis详解 基础拾遗------反射详解 基础拾遗------委托详解 基础拾遗----- ...
- 基础拾遗----RabbitMQ(含封装类库源码)
基础拾遗 基础拾遗------特性详解 基础拾遗------webservice详解 基础拾遗------redis详解 基础拾遗------反射详解 基础拾遗------委托详解 基础拾遗----- ...
- Ruby基础教程
一.Ruby基础知识 1.关于Ruby Ruby是脚本语言 Ruby是面向对象语言 Ruby是跨平台语言 Ruby是开放源码软件 2.Ruby入门书籍推荐 <Ruby.Programming向R ...
- 1月10日 ruby基础教程,查漏补缺; 2月22日 Exception补充
https://ruby-doc.org/core-2.5.0/Exception.html 1月20日练习完1,2章. 第一章 初探 ‘’单引号不执行转义符. \t 制表符.\n 换行符. p me ...
- 基础拾遗----RabbitMQ
基础拾遗 基础拾遗------特性详解 基础拾遗------webservice详解 基础拾遗------redis详解 基础拾遗------反射详解 基础拾遗------委托详解 基础拾遗----- ...
- Java基础拾遗(二)
(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76358523冷血之心的博客) 马上就要秋招了,新的一轮笔试面试马上 ...
- Java基础拾遗(一)
(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76358391冷血之心的博客) 马上就要秋招了,新的一轮笔试面试马上 ...
随机推荐
- 「AHOI2014/JSOI2014」奇怪的计算器
「AHOI2014/JSOI2014」奇怪的计算器 传送门 我拿到这题首先是懵b的,因为感觉没有任何性质... 后来经过同机房dalao的指导发现可以把所有的 \(X\) 放到一起排序,然后我们可以发 ...
- Spring Boot 2.x教程-Thymeleaf 原理是什么
layout: post title: Spring Boot 2.x教程-Thymeleaf 原理是什么 categories: SpringBoot description: Spring Boo ...
- 解决:Field xxMapper in xx.service.impl.xxServiceImpl required a bean of type 'xx.mapper.xxMapper'
1.启动 SpringBoot项目报错,使用的是Springboot.Spring.Mybatis连接Mysql数据库,启动SpringBoot项目报错,错误如下所示: _____ .__/\ .__ ...
- Struts2学习(五)
表达式 1.表达式语言 ( Expression Language )2.表达式的本质: 就是 按照某种规则 书写的 字符串3.表达式的处理: 一定有一套程序 对 表达式 中的 字符串进行解析和处理 ...
- 【PAT甲级】1033 To Fill or Not to Fill (25 分)(贪心,思维可以做出简单解)
题意: 输入四个正数C,DIS,D,N(C<=100,DIS<=50000,D<=20,N<=500),分别代表油箱容积,杭州到目标城市的距离,每升汽油可以行驶的路程,加油站数 ...
- Linux 长时间操作设置不断开
1.第一次尝试失败 修改/etc/ssh/sshd_config文件, 找到 ClientAliveInterval 0 ClientAliveCountMax 3 并将注释符号("#&qu ...
- scrapy shell中遇到的坑
如果直接scrapy shell +网址 然后发现返回200 但是request和response的网址不同,那么可以使用百度短网址 https://dwz.cn/ 进行缩短.这样一般就能解决问题
- mysql innodb cluster 无感知集群
MySQL 8.0.12 innodb cluster 高可用集群部署运维管理手册 Innodb cluster 原理介绍 Innodb cluster 利用组复制的 pxos 协议,保障数据一致性 ...
- C语言程序设计-现代方法(笔记3)
第十三章 字符串 1.字符串字面量(13.1) 字符串字面量:用一对双引号括起来的字符序列.字符串字面量可以像字符常量一样包含转义字序列. 在字符串字面量中小心使用八进制和十六进制的转义序列. 字符串 ...
- TortoiseGit+msysgit保存用户名和密码
本文以windows系统为例 保存用户名和密码 在C盘的c:\Users**qing** (或可能是C:\Users\Administrator) (替换自己的用户名)找到.gitconfig, 如果 ...