• 不过我觉得 Rails 的 ActiveRecord 是比 Martin 的 AR 模式复杂很多的实现,用来实现复杂的领域模型也没问题,但是要求领域模型和数据库表之间的一一对应,不然会有些麻烦。

  • 请教接口设计规范问题 at 2019年02月18日

    这种方法是不好的,创建和更新是两个不同的业务逻辑,需要不同的接口,即使处理的代码有很多相似的地方,也不要合成一个。分开的好处是单一职责,和在一起肯定会增加复杂度,另外就是容易扩展,如果以后两个接口处理的逻辑又有不同,就要再加 if-else 判断是 create 还是 update。不过你应该都知道,那就是沟通和说服别人的问题了,这个是最难的,慢慢来。

  • [n, i].max做了优化,并不是普通的创建临时数组, 不过性能完全依赖实现细节吧

    ruby --dump insns test.rb

    local table (size: 1, argc: 1 [opts: 0, rest: -1, post: 0, block: -1, kw: -1@-1, kwrest: -1])
    [ 1] i<Arg>
    0000 nop                                                              (   2)[Bc]
    0001 getlocal_OP__WC__1 n                                             (   3)[Li]
    0003 getlocal_OP__WC__0 i
    0005 opt_newarray_max 2
    0007 leave
    

    opt_newarray_max 用来比较

    如果是走上半部分的话貌似就不会创建临时数组了

    static VALUE
    vm_opt_newarray_max(rb_num_t num, const VALUE *ptr)
    {
        if (BASIC_OP_UNREDEFINED_P(BOP_MAX, ARRAY_REDEFINED_OP_FLAG)) {
            if (num == 0) {
                return Qnil;
            }
            else {
                struct cmp_opt_data cmp_opt = { 0, 0 };
                VALUE result = Qundef;
                rb_num_t i = num - 1;
                result = ptr[i];
                while (i-- > 0) {
                    const VALUE v = ptr[i];
                    if (result == Qundef || OPTIMIZED_CMP(v, result, cmp_opt) > 0) {
                        result = v;
                    }
                }
                return result == Qundef ? Qnil : result;
            }
        }
        else {
            VALUE ary = rb_ary_new4(num, ptr);
            return rb_funcall(ary, idMax, 0);
        }
    }
    
  • Ruby GC 自述 at 2018年07月09日

    写的不错,ruby hacking guide 中用的是 ruby 1.7 作为例子,那个版本的 gc 代码比较简单,可以看一看,后面就变的越来越复杂了。 另外推荐《垃圾回收的算法与实现》,介绍了其他几个主流 GC 算法。

  • Ruby GC 自述 at 2018年07月09日
    1. 不行
    2. 如果仅仅是你自己的分支或者代码仅仅在你本地(上线了不行,团队里的其他人跑了你的 migration 也不行),直接 rake db:rollback(或者 migrate:down 加上你的 version),然后修改 migration 文件后重跑即可;否则要重建一个 migration 加上默认值
  • 原来为啥用 Sinatra?现在为什么要换?

  • 这篇帖子的作者算活跃人士吧?

  • 这篇说 stackoverflow 上关于 rails 的问题下降趋势挺明显的,比较奇怪。

  • sanitize_sql

  • 年纪越大写代码越慢 at 2017年08月21日

    即使算不过周末,平均一天 100 多行代码也不算低效,应该比较高了

  • 哈哈,我还挺喜欢 clojure 的,不过社区不活跃,看 https://github.com/clojure/clojure 最近的 commit 还是 5 月份的

  • clojure 写 web 太蛋疼吧?没有什么像样的框架。

  • 用 Ruby 的 attr_accessor, 然后 controller 里面调用方法就行。 不过干嘛不用 Rails5 的 custom context 呢?

  • "在缓存里设置 uuid 肯定不行,同一秒发生的请求,缓存也会同时两个一起查和写" 加锁就行了

  • 为 uuid 和 created_at 创建联合唯一约好像不行吧? created_at 的精度不是秒。 一个做法是生成账号后,缓存里面给这个 uuid 设个值,以一个过期时间。每次建的时候先查缓存,没有再建新的。

  • Topic.joins(:votes).group("topics.id").select("topics.*, count(votes.id) as vote_count").order("vote_count desc")

  • 如何读文档? at 2017年07月17日

    姜叔叔... 你们都是 00 后?

  • 如何读文档? at 2017年07月17日

    认同 @adamshen 的说法, 大局入手和了解变化这两点对有一定经验的人来说是适用的(比如掌握了一门语言/框架后再去学另一个语言/框架),对没什么经验或着经验很少的人来说没必要从这两点入手。

  • 三楼的说法是对的,不过这样的配置数据库里存的并不是 utc 的值,还是北京时间。但是显示整个 Model object 的时候,因为会调用 TimeWithZone#to_s(:db), 所以会转成显示 utc 时间。 当你实际实用的时候,比如User.find(2).user_signin_logs.order(created_at: :desc).first.created_at 这是显示的就是北京时间。

    另外 @hz_qiuyuanxin 这样的配置其实是有个问题的, 比如我用户都是国内的,就没必要 config.time_zone = 'UTC',那样配置的话显示的都是 utc 时间,不是本地时间。比如 ruby china 的配置就是 config.time_zone = 'Beijing'

  • 一个字符编码问题 at 2017年04月19日

    这两种编码的字符串只能部分情况做连接运算,就是当它们是兼容的时候,比如 UTF-8 和 ASCII-8 对 ASCII 是兼容的(英文字母,数字,控制字符)等,是可以连接的,如果不兼容的时候是不能连接的。

  • Rails 基础实现学习笔记 at 2017年04月11日

    Rails 可不是 Rack 封装了一下而已,Rails 中 Rack 部分非常少,更多的是 MVC 的部分,可以理解为 Rails 是一个 Rack application 加上 MVC 部分。

  • 5 的时候就加了吧? 除了一楼的还可以 belongs_to :user, optional: true

  • Ruby China 正在衰退吗? at 2017年03月13日

    方便说下转什么语言以及转的原因吗?