【发布时间】:2016-12-26 00:06:20
【问题描述】:
对于这个新手问题,我深表歉意,我对 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
【问题讨论】:
标签: sql ruby-on-rails ruby database