팁 digitalross에 감사드립니다. 나는 외부 솔루션 아이디어를 따라 다음과 같은 작업을 수행했습니다. 카운터를 저장하는 대신 개별 order_combos 레코드를 보관하므로 제안과 약간 다릅니다. 따라서 날짜순으로 쿼리 할 수도 있습니다. 지난주 가장 인기있는 톱 10 주문.
주문 항목 목록을 쉼표로 구분 된 문자열로 변환하는 순서대로 메소드를 만들었습니다.
def to_s
order_lines.sort.map { |ol| ol.id }.join(",")
end
그런 다음 필터를 추가하여 주문할 때마다 콤보가 만들어집니다.
after_save :create_order_combo
def create_order_combo
oc = OrderCombo.create(:user => user, :combo => self.to_s)
end
마지막으로 내 OrderCombo 클래스는 다음과 같습니다. 또한 캐시 된 버전의 메서드가 포함되어 있습니다.
class OrderCombo
belongs_to :user
scope :by_user, lambda{ |user| where(:user_id => user.id) }
def self.top_n_orders_by_user(user,count=10)
OrderCombo.by_user(user).count(:group => :combo).sort { |a,b| a[1] <=> b[1] }.reverse[0..count-1]
end
def self.cached_top_orders_by_user(user,count=10)
Rails.cache.fetch("order_combo_#{user.id.to_s}_#{count.to_s}", :expiry => 10.minutes) { OrderCombo.top_n_orders_by_user(user, count) }
end
end
누군가 주문한 항목 중 더 많은 항목을 주문하면 인기가 높아지지 않기 때문에 완벽하지는 않습니다.