【问题标题】:push pop recenlty viewed session data with ruby on rails使用 ruby​​ on rails 推送 pop 最近查看的会话数据
【发布时间】: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


    【解决方案1】:

    使用数组#unshift方法压入数组开头,#shift从数组开头弹出。

    PS:根据整个控制器和模型代码。我不知道为什么在新版本的 Rails 中这两种方法都过于复杂...模型方法 ::find.. 可以简化为 Product.where('id IN (?)', ids)Product.where(id: ids)(感谢 @bbozo)。

    【讨论】:

    • 确实,Product.where('id IN (?)', ids)也可以换成Product.where(id: ids)
    猜你喜欢
    • 1970-01-01
    • 2013-08-09
    • 2011-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-05
    • 1970-01-01
    相关资源
    最近更新 更多