【发布时间】:2016-04-03 22:54:03
【问题描述】:
以下代码取自 spree_recently_viewed gem
控制器
after_action :recently_viewed, only: :show
def recently_viewed
id = @product.id
rvp = (session['recently_viewed_products'] || '').split(', ')
rvp.delete(id)
rvp << id unless rvp.include?(id.to_s)
rvp_max_count = 5
rvp.delete_at(0) if rvp.size > rvp_max_count.to_i
session['recently_viewed_products'] = rvp.join(', ')
end
助手
module ProductsHelper
def cached_recently_viewed_products_ids
(session['recently_viewed_products'] || '').split(', ')
end
def cached_recently_viewed_products
Product.find_by_array_of_ids(cached_recently_viewed_products_ids)
end
end
型号
class Product < ActiveRecord::Base
def self.find_by_array_of_ids(ids)
products = Product.where('id IN (?)', ids)
ids.map { |id| products.detect { |product| product.id == id.to_i } }.compact
end
end
查看控制器中的这一行
rvp.delete_at(0) if rvp.size > rvp_max_count.to_i
它只是替换索引 0 处的值。有没有一种方法可以添加推送流行样式,以便在新记录添加 0 处的值时,例如移动到 1 和 1 到 2 等等,最后一个被弹出。如果已经存在则移动到索引 0。
【问题讨论】:
标签: ruby-on-rails arrays ruby session