• get_cached_js_ticket 调用的时候用了 dingding_js_t 作 key,之后在里面又调用了 get_js_ticket,get_js_ticket 里面又用 dingding_js_t 作 key,所以 get_js_ticket 里面缓存的代码永远不会被执行

  • 创建新数据主键重复问题 at 2017年06月19日

    如果用的是 postgresql 数据库,导完数据,我一般会跑这么一个 migration,让表的 id sequence 值变成最大,就不会有主键重复的问题了:

    def change
      ActiveRecord::Base.connection.execute("SELECT * FROM pg_catalog.pg_tables where schemaname='public'").each do |r|
        next if r["tablename"] == 'schema_migrations'
        sequence = "#{r["tablename"]}_id_seq"
    
        count = ActiveRecord::Base.connection.execute("SELECT count(*) FROM pg_class where relname='#{sequence}'")
        next if count[0]['count'].to_i == 0
    
        max = ActiveRecord::Base.connection.execute("SELECT MAX(id) FROM #{r["tablename"]}")
        start = max[0]['max'].to_i
    
        current = ActiveRecord::Base.connection.execute("SELECT nextval('#{sequence}')")
        curval = current[0]['nextval'].to_i
    
        if curval <= start
          ActiveRecord::Base.connection.execute("SELECT setval('#{sequence}', #{start + 1}, true)")
        end
    
      end
    end
    
  • Where 两个字段查询问题 at 2017年06月02日
    projects = Project.where(:name => "test")
    projects = projects.where(:language => language) if language.present?
    
  • 如果仅仅是保存,你这么写多了一次不必要且效率低的查询。 其实我那句还可以写得更简单:

    @project.update_attributes(params[:poll])
    
  • project.update_attributes(poll_ids: params[:poll][:poll_ids])
    
  • 如何生成指定的随机数 at 2017年05月24日
    [1, 2, 7].sample
    
  • project = Project.new(project_attrs)
    project.polls.build(poll_attrs)
    project.save
    
  • 有类拟这样一个需求:按一组邮件地址加好友,其中没有注册系统用户的邮件地址,需要发邮件邀请注册用户。 那么这样的代码:

    def invite(mails)
      signed_users = User.where(email: mails)
      add_friends(signed_users)
    
      (mails - signed_users.map(&:email)).each do |mail|
        UserMailer.invite_email(mail).deliver_later
      end
    end
    

    就需要把个方法拆开成便于测试的两个方法来实现,是这样吗? 我就是因为这样的代码不知道怎么测试,才有了上面的折腾,请指教。

  • 这个例子中的业务逻辑比较简单。但在比较复杂的业务逻辑中,对于邮件是否发送,是否发送给正确的用户,如果没测试,我始终感觉不踏实。

  • ?!$ 表示不以某结尾的意思,结合 /\d{3}(?!$)/ 来看表示不是以仅3个数字结尾的字符串,说简单点就是匹配大于3个数字字符的串