ฉันสงสัยว่าวิธีใดเป็นวิธีที่ดีที่สุดในการแสดงบันทึกเฉพาะจาก has_many ผ่านความสัมพันธ์ใน Rails3
ฉันมีสามรุ่น:
class User < ActiveRecord::Base
has_many :orders
has_many :products, :through => :orders
end
class Products < ActiveRecord::Base
has_many :orders
has_many :users, :through => :orders
end
class Order < ActiveRecord::Base
belongs_to :user, :counter_cache => true
belongs_to :product, :counter_cache => true
end
สมมติว่าฉันต้องการแสดงรายการผลิตภัณฑ์ทั้งหมดที่ลูกค้าสั่งซื้อในหน้าแสดงของพวกเขา
พวกเขาอาจสั่งซื้อสินค้าบางรายการหลายครั้งดังนั้นฉันจึงใช้ counter_cache เพื่อแสดงตามลำดับจากมากไปหาน้อยโดยพิจารณาจากจำนวนคำสั่งซื้อ
แต่ถ้าพวกเขาสั่งซื้อผลิตภัณฑ์หลายครั้งฉันต้องตรวจสอบให้แน่ใจว่าผลิตภัณฑ์แต่ละรายการอยู่ในรายการเพียงครั้งเดียว
@products = @user.products.ranked(:limit => 10).uniq!
ทำงานเมื่อมีบันทึกคำสั่งซื้อหลายรายการสำหรับผลิตภัณฑ์ แต่จะสร้างข้อผิดพลาดหากมีการสั่งซื้อผลิตภัณฑ์เพียงครั้งเดียว (อันดับคือฟังก์ชันการจัดเรียงแบบกำหนดเองที่กำหนดไว้ที่อื่น)
อีกทางเลือกหนึ่งคือ:
@products = @user.products.ranked(:limit => 10, :select => "DISTINCT(ID)")
ฉันไม่มั่นใจว่าฉันมาถูกทางแล้ว
มีใครจัดการเรื่องนี้อีกไหม? คุณคิดประเด็นอะไรขึ้นมา ฉันจะหาข้อมูลเพิ่มเติมเกี่ยวกับความแตกต่างระหว่าง. unique ได้ที่ไหน และ DISTINCT ()?
วิธีใดเป็นวิธีที่ดีที่สุดในการสร้างรายการระเบียนเฉพาะผ่าน has_many ผ่านความสัมพันธ์
ขอบคุณ