• 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浅析格式化输出和深浅copy

        一,格式化输出 今天主要想记录一下关于格式化输出的例子,然后结合了自己的理解,分析如下: 格式是 :百分号+占位符 主要有三种使用形式:%s  (其中s表示string)表示字符串 %d  (其中d表 ...

      2. iOS一个简单的设置圆角不引起性能问题的分类

        http://www.cocoachina.com/articles/18756 iOS设置圆角矩形和阴影效果 https://www.cnblogs.com/rayshen/p/4900336.ht ...

      3. mysql之内连接,外连接(左连接,右连接),union,union all的区别

        内连接,外连接,左连接,右连接,全连接 测试数据: CREATE TABLE `a_table` ( `a_id` int(11) DEFAULT NULL, `a_name` varchar(10) ...

      4. vbs 入门

        dim  定义变量名 dim name------------- dim name,agename = "worf"age = 20 msgbox   输出 msgbox name ...

      5. 第4课.编写通用的Makefile

        1.框架 1. 顶层目录的Makefile 2. 顶层目录的Makefile.build 3. 各级子目录的Makefile 2.概述 1.各级子目录的Makefile: 它最简单,形式如下: obj ...

      6. 在Centos上安装Postgre SQL

        检查PostgreSQL 是否已经安装 rpm -qa | grep postgres 检查PostgreSQL 是否已经安装 rpm -qal | grep postgres 检查PostgreSQ ...

      7. 如何启动mac版docker自带的k8s

        最近准备好好学习下k8s,为了图方便,直接使用docker集成的k8s,但是网上找了一些教程但都没能一次性成功,只好自己从头跑一遍,顺手写个教程可以方便有类似需求的同学参考. 话不多说,直接上步骤. ...

      8. ES6 && ECMAScript2015 新特性

          ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准.因为当前版本的ES6是在2015年发布的,所以又称ECMAScript 2015. 也就是说,ES6就是ES201 ...

      9. Android Studio的HAXM不支持虚拟机

        因为我的计算机是服务器,不支持虚拟机,所以报这个错了. 解决方式是直接连接物理手机,打开USB调试,安装驱动,运行项目即可.

      10. webpack中devtool的配置方案[开发模式]---[线上模式]

        // 开发模式下 module.exports = { mode: 'development', devtool: 'cheap-module-eval-source-map' } // 线上模式下 ...