لقد نما لدي البرنامج النصي الخاص بي 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/، وتشغيله.