วิธีเดียวที่เชื่อถือได้ในการกรองสิ่งเหล่านี้คือวิธีที่ค่อนข้างน่าเกลียดในการดึงข้อมูลบันทึกทั้งหมดและเรียกใช้ผ่านการเลือก:
display_ready_products = Product.all.select(&:display_ready?)
สิ่งนี้ไม่มีประสิทธิภาพจนถึงที่สุดโดยเฉพาะอย่างยิ่งหากคุณมีผลิตภัณฑ์จำนวนมากซึ่งอาจไม่เข้าเกณฑ์
วิธีที่ดีกว่าในการทำเช่นนี้คือการมีแคชตัวนับสำหรับรูปภาพของคุณ รวมถึงการตั้งค่าสถานะเมื่อไฟล์ของคุณถูกอัปโหลด:
class Product < ActiveRecord::Base
has_many :photos
end
class Photo < ActiveRecord::Base
belongs_to :product, :counter_cache => true
end
คุณจะต้องเพิ่มคอลัมน์ลงในตารางผลิตภัณฑ์:
add_column :products, :photos_count, :default => 0
นี่จะทำให้คุณมีคอลัมน์พร้อมจำนวนรูปภาพ มีวิธีเติมตัวเลขที่ถูกต้องไว้ล่วงหน้าที่จุดเริ่มต้นแทนที่จะเป็นศูนย์ แต่ไม่จำเป็นต้องระบุที่นี่
เพิ่มคอลัมน์เพื่อบันทึกแฟล็กไฟล์ของคุณ:
add_column :products, :file_exists, :boolean, :null => false, :default => false
ตอนนี้ทริกเกอร์สิ่งนี้เมื่อบันทึก:
class Product < ActiveRecord::Base
before_save :assign_file_exists_flag
protected
def assign_file_exists_flag
self.file_exists = File.exist?(self.file.path)
end
end
เนื่องจากแอตทริบิวต์ทั้งสองนี้แสดงผลเป็นคอลัมน์ฐานข้อมูล คุณจึงสามารถสืบค้นคุณลักษณะเหล่านี้ได้โดยตรง:
Product.find(:all, :conditions => 'file_exists=1 AND photos_count>0')
คุณสามารถทำความสะอาดได้โดยการเขียนขอบเขตที่มีชื่อสองขอบเขตที่จะสรุปพฤติกรรมนั้น
person
tadman
schedule
26.08.2010