ruby-on-rails - instalar gemas de ruby en windows
Usando la gema del Sistema de Reputación del Registro Activo, no ocurre clasificación cuando clasifico por votos (1)
EDITAR
Al poner el código en mis manos, descubrí que el verdadero problema radica en el uso de default_scope
.
La cláusula order()
original especificada en su ámbito predeterminado todavía se está aplicando, incluso cuando se agrega su propia order()
.
Como nota al margen, este problema se corrigió en Rails 4.0, pero el comportamiento se revirtió en 4.0.1.
La solución fue aplicar un reorder()
# model
def self.popular
reorder(''votes desc'').find_with_reputation(:votes, :all)
end
# controller
def index
@microposts = Micropost.page(params[:page]).popular
end
RESPUESTA ORIGINAL
Parece que usar el método de activerecord-reputation-system
directamente puede no funcionar con activerecord-reputation-system
,
Sin embargo, encontré algunos ejemplos que muestran que puedes usar la page
will_paginate
y los métodos:
Quizás funcionará así:
Micropost.page(params[:page]).per(30).find_with_reputation(:votes, :all, order: "votes desc")
O con el alcance del modelo como este:
def self.popular
find_with_reputation(:votes, :all, order: ''votes desc'')
end
podrías hacer esto:
Micropost.page(params[:page]).per(30).popular
Además, como nota al margen, su archivo de rutas es un poco extraño con múltiples bloques de member
, cuando solo uno es necesario. Haría que se vea así:
resources :microposts, only: [:create, :destroy, :index] do
member do
post :vote
post :retweet
end
end
Después de RailsCast para la gema del sistema de reputación, agregué el siguiente código a mi microposts_controller
def index
@microposts = Micropost.paginate(page: params[:page]).find_with_reputation(:votes, :all, order: "votes desc")
@micropost = current_user.microposts.build
end
Pero no ocurre ninguna clasificación en mi acción de índice aparte del alcance predeterminado que establecí en mi modelo
En mi modelo de micropost, tengo
class Micropost < ActiveRecord::Base
belongs_to :user
has_many :retweets
has_reputation :votes, source: :user, aggregated_by: :sum
default_scope -> { order(''created_at DESC'') }
Si cambio el alcance predeterminado a
default_scope -> { order(''votes DESC'') }
Funciona como quiero que solo para la página de índice, pero rompe todas mis otras páginas.
Intenté eliminar el alcance predeterminado y salir en el método find_with_reputation pero todavía no ordena por votos.
También traté de definir el alcance en un método en el modelo de micropost como este
def self.popular
find_with_reputation(:votes, :all, {:order => ''votes desc''})
end
Y crea el código en el microposts_controller como este
def index
@microposts = Micropost.paginate(page: params[:page]).popular
@micropost = current_user.microposts.build
end
Todavía no ordena por votos.
Aquí hay una copia de la salida de registro de visitar la página de índice de micropost https://gist.github.com/anonymous/9745552
Aquí hay un enlace a la gema https://github.com/NARKOZ/activerecord-reputation-system/tree/rails4
Mi routes.rb para microposts se parece a esto
resources :microposts, only: [:create, :destroy, :index] do
member { post :vote }
member { post :retweet}
end
Cualquier orientación es apreciada.
Actualizar
El feed de mi página de inicio está diseñado de forma diferente a lo que estoy haciendo para el feed de índice de Micropost. Tal vez comparar lo que funciona con lo que no ayude a identificar el problema.
Tengo un controlador de Páginas estáticas que establece su alcance para la acción en casa como este
def home
@micropost = current_user.microposts.build
@feed_items = current_user.feed.paginate(page: params[:page])
end
En el modelo de usuario, defino el método de alimentación utilizado en el controlador de páginas estáticas como tal
def feed
Micropost.from_users_followed_by_including_replies(self)
end
el from_users_followed_by_including_replies(self)
es un ámbito que establecí en el modelo de micropost
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
Tal vez deba adaptar un enfoque similar a la acción Index para el controlador Microposts