0

私のモデル (pins.rb) には、2 つの並べ替え順序があります。

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 ピンのみを一覧表示しています。ただし、「注目の」デフォルトスコープを無視し、2番目のスコープのみを使用するように並べ替えたいと思います。

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

Active Record では、データベースに対するクエリは必要になるまで実行されません。モデル (例) でスコープを呼び出すとき、Pins.featy実際にはまだ DB からデータを取得していません。これにより、より多くのスコープをチェーンできます (例: Pins.featy.wheaty)。

@pinsほとんどの場合、DB からのフェッチを強制するために何かを行っています。コントローラーで何をしているか共有できますか?

于 2013-11-05T05:07:24.180 に答える
1

次のようなことを検討することをお勧めします。

Pins.rb :

これにより、リストの一番上にフィーチャーが表示され、2 番目に作成された日付でソートされます。 (ブール値によるソートの2つの方法に注意してください)

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 : これは、ソートされたすべてのユーザー ピンです。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

pins/index.html.erb: これはすべてのピンを上に並べて並べたものcreated_at descです

<%= @pins %>
于 2013-11-05T04:59:33.817 に答える