0

在我的模型(pins.rb)中,我有两个排序顺序:

default_scope order: 'pins.featured DESC' #for adding featured posts to the top of a list
default_scope order: 'pins.created_at DESC' #for adding the remaining posts beneath the featured posts

这个排序顺序(上图)是我希望我的“引脚视图”(index.html.erb)的外观。这只是所有用户帖子的列表。

在我的“用户视图”(show.html.erb)中,我使用相同的模型(pins.rb)仅列出 current_user 引脚。但是,我想排序以忽略“特色”默认范围,只使用第二个范围:

default_scope order: 'pins.created_at DESC'

我怎样才能做到这一点?我试着做这样的事情:

default_scope order: 'pins.featured DESC', only: :index
default_scope order: 'pins.created_at DESC'

但这并没有飞...

更新

我更新了模型以定义范围:

scope :featy,  order: 'pins.featured DESC'
default_scope order: 'pins.created_at DESC'

并将我的别针视图更新为:

<%= render @pins.featy %>

但是,现在当我打开我的引脚视图时,我得到了错误:

undefined method `featy' for #<Array:0x00000100ddbc78>
4

2 回答 2

1

我建议考虑执行以下操作:

Pins.rb

这将导致该功能位于列表顶部,其中的次要排序按其创建时间排序。 (注意布尔排序的两种方法)

class Pin < ActiveRecord::Base
  belongs_to :user

  default_scope  order: 'created_at DESC'
  # Method 1      
  scope :featy,  order('featured DESC, created_at DESC')
  # Method 2
  # scope :featy,  order('(case when featured then 1 else 0 end) DESC, created_at DESC')
end

用户.rb

class User < ActiveRecord::Base
  has_many :pins
end

用户控制器.rb

class UsersController < ApplicationController
  def show
    @user = User.find(params[:id])
    # Pins are accessed via: @user.pins
    # These should be sorted by `created_at DESC` as that is the default_scope
  end
end

users/show.html.erb : 这是所有用户 pin 排序created_at desc

<%= @user.pins %>

PinsController.rb

class UsersController < ApplicationController
  def index
    # Pins sorted by created_at: @pins = Pin.all
    # Pins sorted by created_at with all featured on top: 
    @pins = Pin.featy
  end
end

pin/index.html.erb: 这是所有 pin 排序created_at desc,所有功能都在顶部

<%= @pins %>
于 2013-11-05T04:59:33.817 回答
1

在 Active Record 中,直到需要时才执行对数据库的查询。当您在模型(例如)上调用作用域时Pins.featy,您实际上还没有从数据库中获取数据。这允许您链接更多范围(例如Pins.featy.wheaty)。

最有可能的是,您正在做一些事情@pins来强迫它从数据库中获取。你能分享你在控制器中所做的事情吗?

于 2013-11-05T05:07:24.180 回答