• Rails
    • 大数据情况下

    • 结论:当数据量大到一定程序,请尽量使用原生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基础拾遗的更多相关文章

      1. 基础拾遗------redis详解

        基础拾遗 基础拾遗------特性详解 基础拾遗------webservice详解 基础拾遗------redis详解 基础拾遗------反射详解 基础拾遗------委托详解 基础拾遗----- ...

      2. 基础拾遗------webservice详解

        基础拾遗 基础拾遗------特性详解 基础拾遗------webservice详解 基础拾遗------redis详解 基础拾遗------反射详解 基础拾遗------委托详解 基础拾遗----- ...

      3. 基础拾遗-----mongoDB操作

        基础拾遗 基础拾遗------特性详解 基础拾遗------webservice详解 基础拾遗------redis详解 基础拾遗------反射详解 基础拾遗------委托详解 基础拾遗----- ...

      4. 基础拾遗----RabbitMQ(含封装类库源码)

        基础拾遗 基础拾遗------特性详解 基础拾遗------webservice详解 基础拾遗------redis详解 基础拾遗------反射详解 基础拾遗------委托详解 基础拾遗----- ...

      5. Ruby基础教程

        一.Ruby基础知识 1.关于Ruby Ruby是脚本语言 Ruby是面向对象语言 Ruby是跨平台语言 Ruby是开放源码软件 2.Ruby入门书籍推荐 <Ruby.Programming向R ...

      6. 1月10日 ruby基础教程,查漏补缺; 2月22日 Exception补充

        https://ruby-doc.org/core-2.5.0/Exception.html 1月20日练习完1,2章. 第一章 初探 ‘’单引号不执行转义符. \t 制表符.\n 换行符. p me ...

      7. 基础拾遗----RabbitMQ

        基础拾遗 基础拾遗------特性详解 基础拾遗------webservice详解 基础拾遗------redis详解 基础拾遗------反射详解 基础拾遗------委托详解 基础拾遗----- ...

      8. Java基础拾遗(二)

        (尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76358523冷血之心的博客) 马上就要秋招了,新的一轮笔试面试马上 ...

      9. Java基础拾遗(一)

        (尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76358391冷血之心的博客) 马上就要秋招了,新的一轮笔试面试马上 ...

      随机推荐

      1. python实现队列(queue)

        队列队列是一种先进先出的数据结构,主要操作包括入队,出队.入队的元素加入到对尾,从队头取出出队的元素.这里用列表简单模拟队列,其实现如下: queue()is_empty()size()enqueue ...

      2. 开启Linux服务器vnc远程服务详细步骤

        1.安装rpm包 ,如果没有这个包,请提前下载好,然后输入命令安装   yum localinstall  /usr/local/tigervnc-server-1.1.0-24.el6.x86_64 ...

      3. Python环境搭建-2 编译器和解释器

        编译器与解释器 编译器/解释器:高级语言与机器之间的翻译官 都是将代码翻译成机器可以执行的二进制机器码,只不过在运行原理和翻译过程有不同而已. 那么两者有什么区别呢? 编译器:先整体编译再执行 解释器 ...

      4. 学习笔记(14)- SQuAD的数据格式

        BERT模型完成问答任务的时候,需要数据格式为SQuAD形式. 有2个版本,1.1和2.0

      5. GsonUtils.getGson().fromJson() 转泛型集合用法

        //计算其他收费 List<QiTaFree> qiTaFreeList = GsonUtils.getGson().fromJson(exhiMain.getQiTaFressJson( ...

      6. Flask - 上下文管理(核心)

        参考 http://flask.pocoo.org/docs/1.0/advanced_foreword/#thread-locals-in-flask https://zhuanlan.zhihu. ...

      7. ASP.NET MVC Web项目中使用Log4Net记录日志,并按照日志类型分文件存储

        1.创建MvcLog4Net项目 2.创建 空的MVC项目 3.项目创建完成的效果 4.选择项目,点击鼠标右键,在弹出菜单中选择“管理解决方案的 NuGet 程序包” 5. 在NuGet浏览界面: 点 ...

      8. Kubernetes 深入学习(一) —— 入门和集群安装部署

        一.简介 1.Kubernetes 是什么 Kubernetes 是一个全新的基于容器技术的分布式架构解决方案,是 Google 开源的一个容器集群管理系统,Kubernetes 简称 K8S. Ku ...

      9. rendering path定义了什么?有哪些?有什么作用?有什么限制?

        rendering path 定义了光照在一个shader pass中处理的对象与顺序,如逐像素处理,逐顶点处理,向前处理,后向 deferred用于处理不透明物体,会先把它们根据深度检测,过滤后的内 ...

      10. #写一个随机产生138开头手机号的程序 1.输入一个数量,产生xx条手机号 2.产生的这些手机号不能重复

        import randomcount=int(input('请输入你所想要手机号数量:'))prefix='138'for i in range(count): num=random.sample(r ...