我实现了一种简单的方法,可以让用户更新引脚,但我想按向上的数目来排序,下面是我的to系统:
app/controllers/pins_controller.rb
def upvote
@pin = Pin.find(params[:id])
@pin.votes.create
redirect_to(pins_path)
endapp/models/vote.rb
class Vote < ActiveRecord::Base
belongs_to :pin
endapp/models/pin.rb
has_many :votes, dependent: :destroy我的routes.rb看起来像:
resources :pins do
member do
post 'upvote'
end
en所以我想要我的app/views/pins/index.html.erb
以显示引脚的多数向上投票,以较少向上投票。
我知道可投票提供了一个这样做的系统,但是由于我没有使用gem来实现我的投票系统,所以我不确定使用它是一个好主意。
你认为如何?
我的app/views/pins/index.html.erb如下:
<% @pins.each do |pin| %>
<div class="box panel panel-default">
<%= image_tag pin.image.url(:medium) %>
<div class="panel-body">
<p class="startupinfo">
<%= pin.startupname %><span class="reward"><i class="fa fa-heart"></i> <%= pin.reward %></p></span>
<p class="startupname"><%= pin.description %></p>
<p class="startuptag"><i class="fa fa-map-marker turquoise"></i> <%= pin.tag %> <i class="fa fa-tags turquoise"></i> <%= pin.city %><%= link_to upvote_pin_path(pin), method: :post do %> <i class="fa fa-chevron-circle-up fa-1x" style="color:#28c3ab"></i> <% end %>
<%= pluralize(pin.votes.count, "upvote") %></p>
<p class="users-edit">
<%= link_to pin_path(pin), class: "btn btn-success" do %> Tweet <% end %>
<% if pin.user == current_user %>
<%= link_to 'Edit', edit_pin_path(pin) %>
<%= link_to 'Delete', pin, method: :delete, data: { confirm: 'Are you sure?' } %></p>
<% end %>
</div>
</div>
<% end %>基于BALOO的回答:
我跑了:
rails generate migration add_votescount_to_pins votes_count:integer
rails generate migration add_countercache_to_votes counter_cache:integer我手动更新了迁移_add_votescount_to_pins.rb,因此它看起来如下:
class AddVotescountToPins < ActiveRecord::Migration
def change
add_column :pins, :votes_count, :integer
Pin.reset_column_information
Pin.includes(:votes).all.each do |pin|
Pin.update_counters(pin.id, :votes_count => pin.votes.size)
end
end我跑了:
rake db:migrate然后,我将以下一行添加到我的pins.controller.rb中:
def index
@pins = Pin.all
@pins = Pin.order(votes_count: :desc)
end现在,我的schema.rb文件如下所示:
# encoding: UTF-8
# This file is auto-generated from the current state of the database. Instead
# of editing this file, please use the migrations feature of Active Record to
# incrementally modify your database, and then regenerate this schema definition.
#
# Note that this schema.rb definition is the authoritative source for your
# database schema. If you need to create the application database on another
# system, you should be using db:schema:load, not running all the migrations
# from scratch. The latter is a flawed and unsustainable approach (the more migrations
# you'll amass, the slower it'll run and the greater likelihood for issues).
#
# It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema.define(version: 20140704125839) do
create_table "pins", force: true do |t|
t.string "description"
t.datetime "created_at"
t.datetime "updated_at"
t.integer "user_id"
t.string "image_file_name"
t.string "image_content_type"
t.integer "image_file_size"
t.datetime "image_updated_at"
t.string "tag"
t.string "reward"
t.string "startupname"
t.string "city"
t.string "tweet"
t.string "logo"
t.string "website"
t.string "rewardcode"
t.string "logo_file_name"
t.string "logo_content_type"
t.integer "logo_file_size"
t.datetime "logo_updated_at"
t.integer "votes_count"
end
add_index "pins", ["user_id"], name: "index_pins_on_user_id"
create_table "startups", force: true do |t|
t.string "name"
t.text "description"
t.text "location"
t.text "tag"
t.datetime "created_at"
t.datetime "updated_at"
end
create_table "users", force: true do |t|
t.string "email", default: "", null: false
t.string "encrypted_password", default: "", null: false
t.string "reset_password_token"
t.datetime "reset_password_sent_at"
t.datetime "remember_created_at"
t.integer "sign_in_count", default: 0, null: false
t.datetime "current_sign_in_at"
t.datetime "last_sign_in_at"
t.string "current_sign_in_ip"
t.string "last_sign_in_ip"
t.datetime "created_at"
t.datetime "updated_at"
t.string "name"
t.string "provider"
t.string "uid"
end
add_index "users", ["email"], name: "index_users_on_email", unique: true
add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true
create_table "votes", force: true do |t|
t.integer "pin_id"
t.datetime "created_at"
t.datetime "updated_at"
t.integer "counter_cache"
end
end但是我的引脚指数仍然没有按数量排序!有什么想法吗?
发布于 2014-07-04 12:08:44
所以当你投反对票的时候它就会毁了?
您可以将votes_count整数列添加到引脚中,然后向投票中添加一个counter_cache。
class Vote < ActiveRecord::Base
belongs_to :pin, counter_cache: true
end这将增加一个引脚上的votes_count,因为有人投票支持它。
然后简单地基于此进行查询
@pins = Pin.order(votes_count: :desc)在迁移过程中,您需要根据现有选票更新votes_count。
add_column :pins, :votes_count, :integer, default: true
Pin.reset_column_information
Pin.all.each do |pin|
Pin.reset_counters(pin.id, :votes)
end发布于 2014-07-04 12:21:17
要在没有计数器缓存的情况下实现它,您可以尝试如下:
@pins = Pin.joins(:votes).select('pins.*, COUNT(votes.id) AS vote_count').group('votes.pins_id').order('vote_count DESC')https://stackoverflow.com/questions/24573560
复制相似问题