gpt4 book ai didi

ruby-on-rails - 使用 Active Record Reputation System gem,当我按投票排序时不会发生排序

转载 作者:行者123 更新时间:2023-12-05 00:26:11 26 4
gpt4 key购买 nike

在信誉系统 gem 的 RailsCast 之后,我将以下代码添加到我的 microposts_controller

def index
@microposts = Micropost.paginate(page: params[:page]).find_with_reputation(:votes, :all, order: "votes desc")
@micropost = current_user.microposts.build
end

但是除了我在模型中设置的默认范围之外,我的索引操作中没有进行排序

在我的微博模型中,我有
class Micropost < ActiveRecord::Base
belongs_to :user
has_many :retweets
has_reputation :votes, source: :user, aggregated_by: :sum
default_scope -> { order('created_at DESC') }

如果我将默认范围更改为
default_scope -> { order('votes DESC') }

它仅适用于索引页面,但会破坏我的所有其他页面。

我尝试删除默认范围并保留 find_with_reputation 方法,但它仍然没有按投票排序。

我还尝试在像这样的微博模型中的方法中定义范围
  def self.popular
find_with_reputation(:votes, :all, {:order => 'votes desc'})
end

并使 microposts_controller 中的代码像这样
  def index
@microposts = Micropost.paginate(page: params[:page]).popular
@micropost = current_user.microposts.build
end

它仍然没有按票数排序。

这是访问微博索引页面的日志输出的副本
https://gist.github.com/anonymous/9745552

这是 gem 的链接 https://github.com/NARKOZ/activerecord-reputation-system/tree/rails4

我的用于微博的 route.rb 看起来像这样
  resources :microposts, only: [:create, :destroy, :index] do
member { post :vote }
member { post :retweet}
end

任何指导表示赞赏。

更新

我的主页提要的设计与我为微博索引提要所做的不同。也许将有效的方法与无效的方法进行比较将有助于查明问题。

我有一个静态页面 Controller ,它为这样的 home Action 设置它的范围
def home
@micropost = current_user.microposts.build
@feed_items = current_user.feed.paginate(page: params[:page])
end

在用户模型中,我定义了静态页面 Controller 中使用的提要方法,如下所示
def feed
Micropost.from_users_followed_by_including_replies(self)
end
from_users_followed_by_including_replies(self)方法是我在微博模型中设置的范围
scope :from_users_followed_by_including_replies, lambda { |user| followed_by_including_replies(user) }

def self.followed_by_including_replies(user)
followed_ids = %(SELECT followed_id FROM relationships
WHERE follower_id = :user_id)
where("user_id IN (#{followed_ids}) OR user_id = :user_id OR to_id = :user_id",
{ :user_id => user })
end

也许我需要对 Microposts Controller 的 Index 操作采用类似的方法

最佳答案

编辑

在接触代码时,我发现真正的问题源于 default_scope 的使用。 .

order()即使在添加您自己的 order() 时,您的默认范围中指定的子句仍会被应用。 .

附带说明一下,这个问题在 Rails 4.0 中得到了某种程度的修复,但在 4.0.1 中恢复了该行为。

解决方案是应用 reorder()

# model
def self.popular
reorder('votes desc').find_with_reputation(:votes, :all)
end

# controller
def index
@microposts = Micropost.page(params[:page]).popular
end

原答案

似乎使用 paginate直接方法可能不适用于 activerecord-reputation-system ,

但是,我发现一些示例表明您可以使用 will_paginate pageper方法:

也许它会像这样工作:
Micropost.page(params[:page]).per(30).find_with_reputation(:votes, :all, order: "votes desc")

或者使用这样的模型范围:
def self.popular
find_with_reputation(:votes, :all, order: 'votes desc')
end

你可以这样做:
Micropost.page(params[:page]).per(30).popular

另外,作为旁注,您的路由文件有多个 member 有点奇怪。块,当只需要一个时。我会让它看起来像这样:
resources :microposts, only: [:create, :destroy, :index] do
member do
post :vote
post :retweet
end
end

关于ruby-on-rails - 使用 Active Record Reputation System gem,当我按投票排序时不会发生排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22617224/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com