Ruby on rails 按大多数视图排序的索引

Ruby on rails 按大多数视图排序的索引,ruby-on-rails,ruby,sorting,view,Ruby On Rails,Ruby,Sorting,View,我在按大多数视图对“pin”索引进行排序时遇到问题。该视图未显示任何已排序的“pin”。当用户访问pin时,它将数据存储在“访问详情”和“访问”表中。在这个模型中,我有处理排序的函数,但我不确定这是问题还是发生了什么 create_table "visit_details", force: true do |t| t.integer "visit_id" t.string "ip_address", limit: 15 t.datetime "created_at" t.d

我在按大多数视图对“pin”索引进行排序时遇到问题。该视图未显示任何已排序的“pin”。当用户访问pin时,它将数据存储在“访问详情”和“访问”表中。在这个模型中,我有处理排序的函数,但我不确定这是问题还是发生了什么

create_table "visit_details", force: true do |t|
  t.integer  "visit_id"
  t.string   "ip_address", limit: 15
  t.datetime "created_at"
  t.datetime "updated_at"
end

add_index "visit_details", ["ip_address"], name: "index_visit_details_on_ip_address"

create_table "visits", force: true do |t|
 t.integer  "total_visits"
 t.integer  "unique_visits"
 t.datetime "created_at"
 t.datetime "updated_at"
 t.integer  "pin_id"
end

add_index "visits", ["pin_id"], name: "index_visits_on_pin_id"
我的控制器:

class PinMostViewsController < ApplicationController
 def index
  @random_model = Pin.order('random()').first
  @pins = Pin.top_viewed(params[:page], params[:date])
 end

 def pin_most_views_params
  params.require(:pin).permit(:ip_address, :visit_id)
 end

end
class PinMostViewsController
My pin.rb型号存储逻辑:

class Pin < ActiveRecord::Base
belongs_to :user

acts_as_commentable



has_attached_file :image, :styles => { :medium => "300X300>", :thumb => "100X100>" }



validates :image, presence: true
validates :description, presence: true
    validates_attachment :image, content_type: { content_type: ["image/jpg", "image/jpeg",      "image/png", "image/gif"] }

has_one :visit

  validates :team, presence: true
  validates :position, presence: true

def self.top_viewed(page, time_period)
case time_period
when "all_time"
  Pin.all_time(page)
when "year"
  Pin.order_most_viewed(page, 1.year.ago)
when "month"
  Pin.order_most_viewed(page, 1.month.ago)
when "week"
  Pin.order_most_viewed(page, 1.week.ago)
when "day"
  Pin.order_most_viewed(page, 1.day.ago)
  else
    Pin.all_time(page)
  end
 end

  def self.order_most_viewed(page, date)
  visits, ids = {}, []

  # Create a hash containing pins and their respective visit numbers
  VisitDetail.includes(:visit).where('created_at >= ?', date).each do |visit_detail|
  pin_id = visit_detail.visit.pin_id.to_s

  if visits.has_key?(pin_id)
    visits[pin_id] += 1
    else
    visits[pin_id] = 1
   end
  end

  if visits.blank?
  # Since no visits existed for this time period, we simply return an empty array
  # which will display no results on the view page
  []
  else
  # Now we sort the pins from most views to least views
  visits.sort_by{ |k,v| v }.reverse.each { |k, v| ids << k }

  # With our array of ids, we get all of the pins in the particular order
  Pin.page(page).per_page(30).where(id: ids).order_by_ids(ids)
 end
end

   # A nice query method that will sort by ids, used for the order_most_viewed class method  above
 def self.order_by_ids(ids)
  order_by = ["case"]

  ids.each_with_index.map do |id, index|
  order_by << "WHEN id='#{id}' THEN #{index}"
end

order_by << "end"

 order(order_by.join(" "))
end

 def self.all_time(page)
    Pin.includes(:visit)
    .where('visits.id IS NOT NULL')
    .order("visits.total_visits DESC")
    .order("visits.total_visits > 0")
    .page(page).per_page(30)
 end


 # Instance Methods
 # ================
 def image_remote_url=(url_value)
   self.image = URI.parse(url_value) unless url_value.blank?
   super
 end

 def previous
  self.class.first(:conditions => ["id < ?", id], :order => "id desc")
 end

 def next
 self.class.first(:conditions => ["id > ?", id], :order => "id asc")
    end



end
class Pin{:medium=>“300X300>”,:thumb=>“100X100>”}
验证:映像,状态:true
验证:描述,状态:true
验证附件:图像,内容类型:{content类型:[“image/jpg”,“image/jpeg”,“image/png”,“image/gif”]}
有一个:参观
验证:团队,状态:true
验证:位置、状态:true
已查看def自我顶部(第页,时间段)
病例时间段
当“所有时间”
Pin.所有时间(第页)
当“年”
Pin.订单最多浏览(第页,1年前)
当“月”
Pin.订单\查看次数最多(第页,1个月前)
什么时候是“星期”
Pin.订单\u查看次数最多(第页,1周前)
“天”是什么时候
Pin.订单\u查看次数最多(第页,1.天以前)
其他的
Pin.所有时间(第页)
终止
终止
定义自订单(页面、日期)
访问,id={},[]
#创建包含PIN及其各自访问编号的哈希
VisitDetail.包括(:visit).where('created_at>=?',date)。每个do|visit_详细信息|
pin_id=访问详情。访问。pin_id。访问
如果访问。是否有密码?(pin\U id)
访问[pin_id]+=1
其他的
访问[pin_id]=1
终止
终止
如果是空白的话?
#由于这段时间内不存在访问,我们只返回一个空数组
#在查看页面上不会显示任何结果
[]
其他的
#现在,我们将管脚从大多数视图排序到最少视图
访问。按{k,v{v}排序。反向。每个{k,v{id“id desc”)
终止
def下一个
self.class.first(:conditions=>[“id>?”,id],:order=>“id asc”)
终止
终止
最后是我的视图(按大多数视图排序的管脚索引)


编辑 删去
对不起,我还不能发表评论。你试过追踪它吗? 您可以使用html中的
p
查看那里发生了什么。 也可以在控制器端使用logger.info。
因此,您将看到问题隐藏在何处。当您看到
nil
[]

+1用于使用
case
/
开关时,您是否尝试在控制台中探测模型?启动它并尝试您的模型方法,尤其是
Pin.top\u view(…)
。尝试不同的值,看看它返回什么。
<div id="pins" class="transitions-enabled">
  <% @pins.each do |pin| %>
   <div class="box panel panel-default">
    <%= link_to image_tag(pin.image.url(:medium)), pin %>
     <div class="panel-body">
    <p><%= pin.description %></p>
    <p><strong><%= pin.user.name if pin.user %></strong></p>

    <% if current_user && pin.user == current_user %>
      <div class="actions">
        <%= link_to edit_pin_path(pin) do %>
          <span class="glyphicon glyphicon-edit"></span>
          Edit
        <% end %>
        <%= link_to pin, method: :delete, data: { confirm: 'Are you sure?' } do %>
          <span class="glyphicon glyphicon-trash"></span>
          Delete
        <% end %>
      </div>
    <% end %>

   </div>
  </div>
 <% end %>
</div>