• 关注用 Elixir 的公司,另外直接把公司 logo 和 Elixir 的 logo 放到一起这样好吗?

  • #15楼 @Insub 我们之前的做法是增加了一个 position 字段,每次插入新的节点或者移动位置的时候都会计算出一个合理的 position 出来。以下代码仅供参考:

    module Positionable
      extend ActiveSupport::Concern
    
      DEFAULT_POSITION = 65536
      DEFAULT_POSITION_STEP = 128
    
      included do
        def update_position(params)
          if params[:parent_id].present? && params[:parent_type].present?
            return init_position
          end
          if params[:previous_id].present? && params[:previous_type].present?
            return reposition(params[:previous_id], params[:previous_type])
          end
        end
    
        def init_position
          a = sibling_activities.minimum(:position)
          b = sibling_wbs_elements.minimum(:position)
    
          min_position = [a, b].compact.min
          position = min_position ? min_position/2 : DEFAULT_POSITION
    
          update(position: position)
        end
    
        def reposition(previous_id, previous_type)
          previous_position =
            case previous_type
            when WbsElement::TYPE
              WbsElement.find(previous_id).position
            when Activity::TYPE
              Activity.find(previous_id).position
            end
    
          update(position: new_position(previous_position)) if previous_position.present?
        end
    
        def new_position(position)
          wbs_element_positions = sibling_wbs_elements.pluck(:position)
          activity_positions = sibling_activities.pluck(:position)
    
          positions = wbs_element_positions.concat(activity_positions).sort
          next_position = positions.bsearch { |p| p > position }
    
          next_position ? (position + next_position)/2 : position + DEFAULT_POSITION_STEP
        end
      end
    
    end
    
    

    因为我们当初实现这颗树的时候挂的是两种不同类型的 model, 所以代码优点复杂,实际上使用多态用一种 model 来表示你的节点( Project, Folder, Article) 会要简单很多。 另外,单纯的往树上特定位置增加节点,这些 gem 都很方便吧。我们之所以要计算 position 是因为这个树会需要频繁调整,任意一个节点和子节点都可以调整到任意位置,同时又有严格的顺序要求。closure_tree 的好处是树形关系是由 gem 维护在另外的表中。移动位置不会造成大量 SQL。

  • Rails 最佳实践 - 定时任务 at 2017年1月18日

    我感觉用 whenever 就够了。

  • 推荐使用 closure_tree, 我们之前也有类似需求。节点用多态指向你的 Folder / Article / Report

  • Ruby 3 Guilds 并发模型 at 2016年10月18日

    还是觉得 Actor 这种模型要更优秀。

  • 👍 厉害

  • Elixir & Phoenix Conf 2016 视频 at 2016年9月29日

    已经在刷了

  • 顶,看过之前的视频,不错的说。 @tony612 这一期也会录的吧?

  • 👍