วิธีแคชวัตถุโมเดล ActiveRecord ซึ่งมีตัวอัปโหลด Carrierwave ไปยัง Redis

ฉันมีโมเดลผู้ใช้ซึ่งมีตัวอัปโหลด Carrierwave สำหรับจัดเก็บรูปโปรไฟล์ผู้ใช้

class User < ActiveRecord::Base
    mount_uploader :profilepic, LogoUploaderUploader

ฉันต้องการแคชวัตถุ User นี้ใน Redis ในขณะที่แคชฉันเรียกใช้เมธอด to_json บนวัตถุ activerecord ซึ่งแปลงฟิลด์profilepicในวัตถุผู้ใช้เป็นแฮชที่มี URL ของรูปภาพ

user={id:1, username: "sam", profilepic: {url:"path_to_image.jpg"}}

ส่วนนี้ใช้ได้และฉันสามารถเก็บไว้ใน Redis ได้ แต่ปัญหาเกิดขึ้นเมื่อฉันดึงข้อมูลจาก Redis และพยายามแปลงเป็นวัตถุ ActiveRecord ดังต่อไปนี้

user=User.new(json_data)

ฟิลด์โปรไฟล์มีค่าเป็นโมฆะ ดูเหมือนว่าจะไม่สามารถดีซีเรียลไลซ์แฮชของโปรไฟล์ profilepic: {url:"path_to_image.jpg"} ให้เป็นค่าที่เหมาะสมได้

มีวิธีใดบ้างที่ฉันสามารถคืนค่าที่เหมาะสมสำหรับโปรไฟล์หลังจากบันทึกไปที่ Redis


person Arun Satyarth    schedule 14.06.2017    source แหล่งที่มา


คำตอบ (1)


แทนที่จะจัดเก็บ ActiveRecord::Base ใน Redis คุณควรจัดเก็บ id และโหลดออบเจ็กต์ใหม่จากฐานข้อมูลเมื่อจำเป็น

เหตุผลนั้นค่อนข้างง่าย: ไม่สามารถสร้างอินสแตนซ์ ActiveRecord::Base ใหม่โดยทำให้อนุกรมเป็น JSON และกู้คืนด้วย Model.new(json_data) ได้ เนื่องจาก to_json อาจไม่ได้ซีเรียลไลซ์แอ็ตทริบิวต์ทั้งหมด และ Model.new อาจไม่สามารถกู้คืนสถานะภายในของอินสแตนซ์ได้

ในตัวอย่างของคุณ ปัญหาเฉพาะคือ User.new คาดว่าจะมีอ็อบเจ็กต์ไฟล์สำหรับ profilepic แต่เมธอด to_json ไม่สามารถเรนเดอร์วัตถุไฟล์ลงใน JSON ได้ แต่จะเรนเดอร์แฮชที่มี URL แทน

person spickermann    schedule 14.06.2017
comment
ฉันพยายามแนะนำเลเยอร์แคชโดยบันทึกบันทึกใน Redis การโหลดจาก db จะทำให้วัตถุประสงค์ล้มเหลว หากมีวิธีกำหนด URL กลับไปที่ช่องอัปโหลดของ Carrierwave นั่นคือสิ่งที่ฉันต้องการ.... - person Arun Satyarth; 16.06.2017
comment
ฐานข้อมูลของคุณสำหรับการสืบค้นแบบง่าย ๆ เช่นนั้นช้ากว่า Redis หรือไม่ ทำไม ดัชนีหายไป? - person spickermann; 16.06.2017
comment
นี่เป็นส่วนใหญ่เพื่อให้ฉันสามารถเปรียบเทียบตัวเองว่า Redis รวดเร็วอย่างเห็นได้ชัดนั้นเร็วกว่า mySQL โดยเฉพาะอย่างยิ่งกับส่วนคำสั่งต่าง ๆ ในโมเดลผู้ใช้ - person Arun Satyarth; 16.06.2017
comment
ฉันทำมันชั่วคราวโดยมีวิธีแก้ไขปัญหาต่อไปนี้ ฉันเพิ่มสิ่งต่อไปนี้ใน User model attr_accessor :picture และในขณะที่สร้าง User object จาก json ฉันเพิ่งอ่านจาก user[:profilepic][:url] และกำหนดให้กับรูปภาพ จากนั้นฉันก็อ่านจากรูปภาพในมุมมอง... - person Arun Satyarth; 16.06.2017