Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Ruby

การเขียนสคริปต์แบบใช้ครั้งเดียวใน Rails

คุณเคยต้องการนำเข้าข้อมูลจำนวนมากไปยังแอปของคุณจากไฟล์ CSV หรือไม่? หรือบางทีคุณอาจต้องแก้ไขอักขระที่เข้ารหัสไม่ดีในบทวิจารณ์ของลูกค้าบางส่วน หรือคุณเปลี่ยนใจเกี่ยวกับวิธีการจัดเก็บข้อมูลใน Redis และต้องย้ายทุกอย่างจากรูปแบบเก่าไปยังรูปแบบใหม่

ที่ Avvo เราเรียกสิ่งเหล่านี้ว่า “งานเฉพาะกิจ” ในทำนองเดียวกัน คุณอาจต้องเรียกใช้เพียงครั้งเดียว แล้ววิธีที่ดีที่สุดในการจัดการงานเฉพาะกิจใน Rails คืออะไร

เขียนการย้ายฐานข้อมูล

การโยกย้ายทำงานได้ดีถ้าคุณต้องการเปลี่ยนโครงสร้างของข้อมูลในฐานข้อมูลของคุณ ติดตามว่างานถูกเรียกใช้หรือไม่ ดำเนินการเปลี่ยนแปลงกับสภาพแวดล้อมอื่น ๆ คือสิ่งที่สร้างการย้ายข้อมูล สำหรับ. นอกจากนี้ยังเป็นสิ่งที่คุณอาจใช้อยู่แล้วด้วย

หากคุณกำลังเปลี่ยนแปลงข้อมูลพร้อมกัน การย้ายข้อมูล อาจ ทำงานได้ดี แต่มีบางสิ่งที่ต้องระวัง

เรียกบางอย่างเช่น Permissions.create(...) ในการย้ายถิ่นของคุณอาจทำให้เกิดปัญหาได้ หากแบบจำลองมีการเปลี่ยนแปลง การย้ายข้อมูลของคุณอาจล้มเหลว เนื่องจากแบบจำลองของคุณอาจไม่พร้อมใช้งานเมื่อดำเนินการย้าย หรือแบบจำลองของคุณอาจเปลี่ยนไประหว่างเวลาที่คุณเขียนการย้ายข้อมูลและเวลาที่เรียกใช้ มีวิธีแก้ไขปัญหานี้ แต่มีโอกาสเกิดข้อผิดพลาดและอาจล้มเหลวได้ด้วยวิธีแปลกๆ

การย้ายข้อมูลยังมีประโยชน์น้อยกว่าหากงานของคุณไม่เกี่ยวข้องกับ ActiveRecord

สิ่งเหล่านี้ไม่ใช่ตัวทำลายข้อตกลง แต่ฉันมักจะไม่นำเข้าหรือเปลี่ยนแปลงข้อมูลมากนักในการย้ายข้อมูล มีตัวเลือกที่ดีกว่า

เขียนงานคราด

คุณมีงาน คุณอาจต้องการเรียกใช้เพียงครั้งเดียว และคุณต้องการทดสอบกับเครื่องของคุณและใช้งานจริงในเวอร์ชันที่ใช้งานจริง

งานคราดทำงานได้ดีมากสำหรับสิ่งนี้ Rails ยังสร้างงานคราดให้คุณได้:

$ be rails g task locations import
      create  lib/tasks/locations.rake

สิ่งนี้จะสร้างไฟล์ให้คุณซ่อนรหัสของคุณ:

lib/tasks/locations.rake
namespace :locations do
  desc "TODO"
  task import: :environment do

  end
end

ภายในนั้น task บล็อก คุณสามารถใช้โมเดลทั้งหมดของคุณและโค้ดที่เหลือในแอป Rails ของคุณได้ นำเข้าและเปลี่ยนแปลงข้อมูลได้ง่าย เนื่องจากคุณสามารถเขียนโค้ดได้เหมือนกับนั่งอยู่ที่คอนโซลของ Rails

เมื่อคุณเขียนงานของคุณแล้ว คุณสามารถเรียกใช้งานด้วย rake locations:import . หากคุณใช้ Heroku คุณสามารถเรียกใช้ด้วย heroku run rake locations:import . หากคุณกำลังใช้ Capistrano คุณสามารถใช้อัญมณี capistrano-rake เพื่อทำงานของคุณ แต่คุณอาจมีตัวเลือกที่ดีกว่านี้

เขียนงานที่กำหนดเวลาไว้โดยใช้ sidekiq-scheduler

หากแอปของคุณใหญ่พอ แสดงว่าคุณน่าจะ ใช้ Sidekiq, Resque หรืออะไรทำนองนั้นอยู่แล้ว

ตัวประมวลผลงานเบื้องหลังส่วนใหญ่เหล่านี้สามารถกำหนดเวลาให้งานทำงานในภายหลังได้ ตัวอย่างเช่นใน Sidekiq มี gem sidekiq-scheduler และด้วย sidekiq-scheduler ก็มีเคล็ดลับที่คุณสามารถทำได้

จะเป็นอย่างไรถ้าคุณมีงานที่ไม่เคยอัตโนมัติ กำหนดเวลาเอง แต่ให้คุณด้วยตนเอง กำหนดเวลาได้ทุกเมื่อที่คุณต้องการหรือไม่ ซึ่งจะทำงานได้ดีสำหรับงาน "ครั้งเดียว" ที่คุณอาจต้องการเรียกใช้อีกครั้งในภายหลัง หรือว่าคุณต้องการเรียกใช้โดยใช้ UI

ใน sidekiq-scheduler คุณสามารถกำหนดเวลางานได้ไกลในอนาคต และตั้งค่างานเป็นปิดใช้งาน:

sidekiq.yml
:schedule:
  location_importer:
    class: LocationImporterWorker
    at: '3001/01/01'
    enabled: false

จากนั้น เมื่อคุณไปที่ sidekiq-web คุณจะเห็นปุ่มสำหรับจัดคิวงานด้วยตนเอง:

การเขียนสคริปต์แบบใช้ครั้งเดียวใน Rails

ด้วยสิ่งนี้ คุณสามารถรันงานของคุณได้ทุกเมื่อที่พร้อม ทั้งในด้านการพัฒนาและการผลิต และหากคุณต้องการเรียกใช้อีกครั้ง ก็จะมีอยู่ใน UI

นี่ไม่ใช่ตัวเลือกที่ดีที่สุดหากงานของคุณเป็นอันตราย ง่ายเกินไปที่จะคลิกปุ่มนั้นโดยไม่ได้ตั้งใจ และมันก็ไม่ดีเช่นกันหากงานนั้นใช้เวลาสักพักกว่าจะเสร็จ เพราะ Sidekiq จะทำงานได้ดีที่สุดถ้างานเสร็จเร็ว งานของคุณจะรับช่วงต่อผู้ปฏิบัติงาน และคุณจะไม่สามารถเริ่ม Sidekiq ใหม่ได้อย่างปลอดภัยจนกว่างานของคุณจะเสร็จสิ้น แต่ถ้างานของคุณเร็วและวิ่งได้อย่างปลอดภัยมากกว่าหนึ่งครั้ง วิธีนี้ได้ผลดี หากเป็นงานประเภททำความสะอาด คุณอาจตัดสินใจว่าคุณต้องการต้องการ เพื่อเรียกใช้เป็นประจำ

หากคุณต้องการเน้นที่การตั้งเวลาและการทริกเกอร์เท่านั้น หรือต้องการความยืดหยุ่นมากขึ้นในการตั้งค่าพารามิเตอร์ในสคริปต์แบบใช้ครั้งเดียวของคุณ Dmitry ผู้อ่านได้ชี้ให้ฉันไปที่ sidekiq-enqueuer ด้วย sidekiq-enqueuer คุณสามารถกำหนดเวลางานและตั้งค่าพารามิเตอร์ได้ทั้งหมดผ่านทางเว็บอินเทอร์เฟซของ Sidekiq

SSH ลงในเวอร์ชันที่ใช้งานจริงและวางโค้ดลงในคอนโซล Rails

ล้อเล่นนะครับ

คุณควรเลือกอันไหน

ฉันได้ใช้วิธีเหล่านี้ทั้งหมดเพื่อทำงานแบบครั้งเดียว แต่ปกติฉันจะไปหาคราดก่อน ใช้งานได้จริง ใช้งานโดยไม่ได้ตั้งใจได้ยาก และกำจัดได้ง่ายเมื่อใช้งานเสร็จแล้ว ฉันไม่ได้เลือกงานคราดทุกครั้ง

ฉันอาจเลือกการย้ายข้อมูลหาก:

  • งานแก้ไขข้อมูลโดยใช้ SQL เป็นส่วนหนึ่งของการเปลี่ยนแปลงสคีมาฐานข้อมูล
  • งานนี้เป็นงานข้อมูลที่เรียบง่าย เช่น การเปลี่ยนแปลงข้อมูลในคอลัมน์หรือเพิ่มระเบียนบางส่วน
  • ฉันต้องการติดตามอย่างง่ายดายว่ามีการเรียกใช้งานแล้วหรือไม่และไม่เรียกใช้อีก

ฉันอาจเลือกงาน Sidekiq ถ้า:

  • ฉันคิดว่าฉันอาจต้องการเรียกใช้งานนี้อีกครั้งในภายหลัง
  • ใครก็ได้ที่ไม่ใช่ฉันที่ต้องเรียกใช้ สิ่งที่พวกเขาต้องทำคือคลิกปุ่ม
  • เป็นการนำเข้าข้อมูลสั้นๆ หรืองานล้างข้อมูล ฉันอาจจะต้องทำสิ่งเหล่านี้เป็นประจำ แม้ว่าฉันจะไม่ได้คาดหวังในตอนแรกก็ตาม

แล้วคุณล่ะ คุณมีตัวเลือกอื่นหรือทำทางเลือกอื่นหรือไม่? แสดงความคิดเห็นและแจ้งให้เราทราบ!