رد فعل في ندوة

لقد نما لدي البرنامج النصي الخاص بي Script framework to rearrange topics and categories بوظيفة جديدة تتجاوز قليلاً إعادة ترتيب المواضيع والفئات!

عادةً ما أتذكر أن أحذر الأشخاص من أنني لا أعرف لغة Ruby أو Ruby on Rails، لذا فإن الكود الخاص بي غريب الأطوار بدلاً من أن يكون اصطلاحيًا. لكن يبدو أنه يعمل حتى الآن في اختباري!

  def migrateRetortToReactions(allowed:, likes: nil, emojimap: nil)
    # ترحيل حيثما أمكن دون تجاوز أي إعجابات موجودة
    # هذا تحويل خاسر بالضرورة، وهو متسق فقط بترتيب PostDetail
    # لا يتم بذل أي محاولة لتفضيل سجل PostDetail على آخر
    emojimap = {} if emojimap.nil?
    allowed.each do |a|
      emojimap[a] = a
    end
    retort = "retort".freeze
    emojiType = "emoji".freeze
    usermap = Hash.new { |hash, username| hash[username] = User.find_by_username(username) }
    postmap = Hash.new { |hash, post_id| hash[post_id] = Post.find(post_id) }
    likeType = PostActionType.where(name_key: "like").pluck(:id).first

    PostDetail.where(extra: retort).each do |pd|
      begin
        p = postmap[pd.post_id]
      rescue
        # PostDetail غير متسق فيما يتعلق بالحذف
        $stderr.puts sprintf("Could not find post for %d: %s / %s", pd.post_id, pd.key, pd.value)
        next
      end
      emoji = pd.key.split('|').first
      users = JSON.parse(pd.value)
      users.each do |user|
        u = usermap[user]
        next if u.nil? # تغيير اسم المستخدم أو حذف المستخدم يترك ردود فعل معلقة
        if likes.include?(emoji)
          pa = PostAction.where(post_id: p.id, user_id: u.id, post_action_type_id: likeType).first
          next unless pa.nil?
          $stderr.puts sprintf("Adding like for Retort %s for user %s in %s", emoji, user, p.url)
          PostActionCreator.create(u, p, :like, created_at: pd.created_at, silent: true)
        elsif emojimap.has_key?(emoji)
          e = emojimap[emoji]
          r = DiscourseReactions::Reaction.where(post_id: p.id, reaction_type: emojiType, reaction_value: e).first_or_create
          ru = DiscourseReactions::ReactionUser.where(user_id: u.id, post_id: p.id).first
          next unless ru.nil?
          $stderr.puts sprintf("Converting Retort %s to Reaction %s for user %s in %s", emoji, e, user, p.url)
          DiscourseReactions::ReactionUser.create(reaction_id: r.id, user_id: u.id, post_id: p.id, created_at: pd.created_at)
        else
          $stderr.puts sprintf("Ignoring unmapped Retort %s for user %s in %s", emoji, user, p.url)
        end
      end
    end
  end

أستخدم الإطار الذي بنيته لتوفير تكوين YAML يبدو كالتالي:

- migrateRetortToReactions:
    allowed:
      - rofl
      - astonished
      - crossed_fingers
      - sob
      - thinking
      - grimacing
      - frowning_face
      - drum
    likes:
      - dart
      - +1
      - joy
      - "100"
      - brain
      - heart
      - heart_eyes
      - hearts
    emojimap:
      rage: sob
      four_leaf_clover: crossed_fingers
      cry: sob
      open_mouth: astonished
      scream: frowning_face

ومع ذلك، يمكنك ببساطة تغليف ذلك في برنامج نصي Ruby يتضمن جعل تلك الوسائط كود Ruby حرفي، وإسقاطه في دليل script/، وتشغيله.

إعجابَين (2)