如何计算用户对我的特定项目(Rails)所做的所有喜欢

时间:2016-12-26 00:06:20

标签: sql ruby-on-rails ruby database

我为新手问题道歉,我对Rails和SQL比较陌生。我正在尝试计算用户对我的特定项目所做的所有喜欢。在SO社区和Treehouse Coding的帮助下,我能够显示哪些用户喜欢我的特定项目。此外,我能够研究如何在我的控制器中使用.join显示我收到的所有喜欢的内容(来自Lisa,James,Harry等)。现在我想显示每个特定用户的计数。所以,例如,如果詹姆斯喜欢我的4件物品,我想在詹姆斯旁边展示4件。我在下面列出了所有相关代码,非常感谢你们!

Index.html.erb

My Fans - <%= @likersnumero%>
<%- @likers.each do |liker| %>
<%= image_tag liker.avatar, width: 25, class: "css-style"  %>
<%= liker.username %>
<% end %>

Items_controller

def index
@items = Item.order("created_at DESC")
if current_user.present? 
@likers = current_user.items.map(&:likes).flatten.map(&:user).flatten
@likersnumero = current_user.items.joins(:likes).map(&:user).count
end
end

item.rb的

class Item < ApplicationRecord
has_many :likes, :counter_cache => true
end

users.rb的

class User < ApplicationRecord
has_many :likes
def likes?(post)
    post.likes.where(user_id: id).any?
end

#Tried using def total_likes in my index.html.erb using <%= liker.total_likes%>
but got the following
 error SQLite3::SQLException: no such column: likes:
 SELECT SUM(likes) FROM "likes" WHERE "likes"."user_id" = ?"
def total_likes
    likes.sum(:likes)   
end
end

的routes.rb

Rails.application.routes.draw do
resources :items do
resource :like, module: :items
end
root to: "items#index"
end

Schema.rb

create_table "items", force: :cascade do |t|
t.string   "product"
t.integer  "user_id"
t.integer  "item_id"
t.datetime "created_at",                      null: false
t.datetime "updated_at",                      null: false
t.string   "avatar_file_name"
t.string   "avatar_content_type"
t.integer  "avatar_file_size"
t.datetime "avatar_updated_at"
t.integer  "likes_count",         default: 0, null: false
end

create_table "likes", force: :cascade do |t|
t.integer  "user_id"
t.integer  "item_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end

2 个答案:

答案 0 :(得分:0)

鉴于liker是喜欢发帖的用户,而poster_id是创建帖子的人的ID。

liker.likes.joins(:items).where('items.user_id = ?', poster_id).count

或者类似的东西。如果您发布annotated模型或表格架构,我可能会得到更好的答案。

答案 1 :(得分:0)

经过无数的阅读和体验,我找到了对我有用的答案。万一有人可能会遇到类似的问题 - 我提供的答案对我有用。

要让所有用户项目的特定用户总得 - 在我的控制器中我放了以下内容     @likersuno = @ likers.map(&amp ;: likes).flatten.map(&amp;:user).flatten.uniq

在我的index.html.erb

我只是把它放在那里,它从那里起作用

<%= @likersuno.count %> 

要获得特定用户对的总评价 - 在我的index.html.erb中,我将以下内容与之相得益彰

<%= liker.likes.select { |like| like.item.user == current_user }.count %>