如何根据最近查看的属性

时间:2016-04-21 05:31:50

标签: ruby-on-rails ruby-on-rails-3 activerecord

我想列出登录用户信息中心中最近查看的属性。

因此,我创建了一个名为recentview的表,包含3个字段,即; user_id,property_id和view_time(将在单击该属性时在表中输入当前视图时间)。 我试过下面的代码。但问题是它在同一个属性的每次点击中多次输入相同的记录。我需要的是,如果我单击一个应该在表中输入的属性,并且在下一次单击同一属性时,相同属性记录的view_time应该更新。

<% if current_or_null_user.recentviewed? property %>
   <a href = "<%=recentviews_path(:id => property.id)%>" data-method="post" ><div class="img-blocks" style="background-image:url(<%= property.image.url(:thumbnail)%>)"></div></a>
 <% else %>
   <a href = "<%=recentviews_path(:id => property.id)%>" data-method="post" >   <div class="img-blocks" style="background-image:url(<%= property.image.url(:thumbnail)%>)"></div></a>
<%end%>

点击属性当前时间,property_id和user_id存储在数据库中 我的控制器

class RecentviewsController < ApplicationController
  before_action :authenticate_user!, except: :create
  def create
    if user_signed_in?
      @views = Recentview.where(user_id: current_user.id, property_id: params[:id],view_time: Time.now.strftime("%d/%m/%Y %H:%M")).first_or_create
      redirect_to :back
    else
      redirect_to new_user_session_path, alert: 'Please login/Sign up to add this property to your favourite.'
    end
  end
end

我的模特

class User < ActiveRecord::Base
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable
  has_many :properties  
  has_many :recentviews
  has_many :recentviewed_properties, through: :recentviews, source: :property  
  
  def recentviewed? property
    recentviewed_properties.include? property
  end
end
                               
                               
                               

class Recentview < ActiveRecord::Base
  belongs_to :user
  belongs_to :property
end

class Property < ActiveRecord::Base
	belongs_to :user
	has_many :recentviews
	mount_uploader :image, ImageUploader

end

请提供解决此问题的解决方案。 我将如何更新每次点击中的view_time,以及我将如何避免在recentviews表中使用相同属性的多个条目 任何帮助都是值得赞赏的

1 个答案:

答案 0 :(得分:0)

@views = Recentview.where
  (user_id: current_user.id, property_id: params[:id],
   view_time: Time.now.strftime("%d/%m/%Y %H:%M")).first_or_create

在这一行中(为了便于阅读,现在拆分为3),您将始终在数据库中创建新的RecentView记录,因为Time.now将始终具有新值(与现有记录相比)。

也许你可以试试:

@recent_view = Recentview.where(user_id: current_user.id, property_id: params[:id]).first_or_create

然后,一旦找到记录或创建了新记录,就可以将view_time设置为:

@recent_view.update(view_time: Time.now.strftime("%d/%m/%Y %H:%M")) 

使用这种方法,您应该无意中创建多个记录。