• ActiveRecord Store 使用介绍 at 2017年03月08日

    👍 ,的确很坑,得定义permissions= 的行为才行

  • ActiveRecord Store 使用介绍 at 2017年03月08日

    哦,这个用法没试过,回头试试。我想当然以为serialize要求数据库类型必须为string了

    不过搜了下5.0的doc,貌似不推荐这种情况用serialize了

    http://api.rubyonrails.org/classes/ActiveRecord/AttributeMethods/Serialization/ClassMethods.html

    If you have an attribute that needs to be saved to the database as an object, and retrieved as the same object, then specify the name of that attribute using this method and it will be handled automatically. The serialization is done through YAML. If class_name is specified, the serialized object must be of that class on assignment and retrieval. Otherwise SerializationTypeMismatch will be raised.

    Empty objects as {}, in the case of Hash, or [], in the case of Array, will always be persisted as null.

    Keep in mind that database adapters handle certain serialization tasks for you. For instance: json and jsonb types in PostgreSQL will be converted between JSON object/array syntax and Ruby Hash or Array objects transparently. There is no need to use serialize in this case.

    For more complex cases, such as conversion to or from your application domain objects, consider using the ActiveRecord::Attributes API.

  • ActiveRecord Store 使用介绍 at 2017年03月08日

    这个功能只要orm层可以反射为hash就可以实现了,使用hstore或者serialize在这个场景并没有啥区别,但是我的意思是hstore的好处是,它是pg原生支持的类型,可以做

    SELECT
     sum (attrs -> 'like_count') As total_likes
    FROM
     posts;
    GROUP BY xxx
    

    这种级别的操作,所以如果数据库层面原生支持json,最好直接用原生类型,而不是serialize。

  • ActiveRecord Store 使用介绍 at 2017年03月08日

    是不冲突,效率低功能少呀

  • ActiveRecord Store 使用介绍 at 2017年03月08日

    postgre 原生的数据类型支持索引,支持数据库级别的操作,能用原生就用原生的 active record 的方案是在数据库不支持的前提下没办法的方案。

  • 比如下面payment里面这段代码

    def self.create_from_orders! user, *orders
      orders.flatten!
    
      payment = nil
      transaction do
        payment = user.payments.create!(
          total_money: orders.sum(&:total_money)
        )
    
        orders.each do |order|
          if order.is_paid?
            raise "order #{order.order_no} has already paid"
          end
    
          order.payment = payment
          order.save!
        end
      end
    

    既没有看到使用悲观锁,订单上也没有创建乐观锁,方法内也并没有分布式锁做排他调用保证

    create_table "orders", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t|
      t.integer  "user_id"
      t.integer  "product_id"
      t.integer  "address_id"
      t.string   "order_no"
      t.integer  "amount"
      t.decimal  "total_money", precision: 10, scale: 2
      t.datetime "payment_at"
      t.datetime "created_at",                                               null: false
      t.datetime "updated_at",                                               null: false
      t.integer  "payment_id"
      t.string   "status",                               default: "initial"
      t.index ["order_no"], name: "index_orders_on_order_no", unique: true, using: :btree
      t.index ["payment_id"], name: "index_orders_on_payment_id", using: :btree
      t.index ["user_id"], name: "index_orders_on_user_id", using: :btree
    end
    
    
  • 也没有考虑地址可能修改的问题

  • 貌似代码没有考虑concurrency问题

  • Ruby 的爬虫世界 at 2016年12月27日

    任务管理简单点可以用sidekiq,worker放在docker里面,集群部署不是啥问题~

  • 简单点可以以行做为最小单位来保存,记录行的初始状态和最后编辑结果

    多个行操作对应一次操作动作(实现复制粘贴多行的redo需求),前进和后退的操作就转换成为了每个操作动作对应行历史的批量操作

    如果所有结果只能存在内存里,需要借限制保存的行数或操作动作数来限制总内存使用。

  • docker 一般建议nginx+passenger/puma/... + 服务打包在一个container里面,作为一个随时可以工作的整体来发布。

    我们目前的做法是:bundle依赖包的 path 放在项目目录下, 打包的过程可以放在jenkins上,jenkins 环境配成和docker内部一样,通过jenkins做bundle,然后把项目文件+依赖直接copy入container打包。

    日志文件需要通过日志归集服务统一做收集。

    总的来说是有一定成本的,应用需要考虑成本和收益是否合算,我们因为微服务拆分的比较多,也有动态扩容的需求,所以在往这个方向走。如果只是做单一网站这种需求,并不建议这么做。

  • dy1901

  • 有意思~

  • 关键就在于显示器的高低,一定要平视

  • 改成int吧,用rails 早晚是个坑

  • #13楼 @yukihiro_matz 你这头像和用户名太高大上了~

  • #13楼 @yukihiro_matz 是,用docker gem以外的依赖会简单一点,比如如果你需要es或者redis服务来支撑的话

  • 上docker吧

  • ElasticSearch 相关问题 at 2015年11月17日

    es不是关系型数据库,如果想用tag搜其他的模型,可以在建立mapping的时候把tag放到其他的index里面,然后tag标签就可以作为搜索条件了,搜英文的时候需要设置相应的分词规则,因为es全文搜索是基于倒排表的,建议楼主先简单看看es全文的原理

  • apt-get install python-pip
    pip install shadowsocks
    sudo ssserver -p 443 -k password -m aes-256-cfb --user nobody -d start
    

    就这三条命令就ok了

  • 我记得shadowsocks有pip安装包,在裸机上先安装,然后运行一条后台运行命令,服务端的事情就搞定了。要比楼主的方案简单。

  • #6楼 @jerrym 业务复杂了以后加索引可以根据慢查询记录来做,有针对的来加索引。一般来说正常配置的机器上面,mysql数据量在千万以下的级别,不会有性能问题,60w的库完全算不上大,觉得访问慢那基本是在扫表~

    建议楼主详细看看关于mysql索引的资料,优化的时候多用用explain,看看查询到底有没有命中索引。

  • Splunk, ELK

  • #30楼 @xieyu33333 正常用户访问用前端渲染,搜索引擎可以根据user agent用v8做server端渲染,直接输出html给搜索引擎。

  • #2楼 @jimrokliu 可以用来做服务间异步调用,丢出去不用管那种,不知道楼主是不是也用来做这个