質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

91.47%

  • Ruby

    5039questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

  • Ruby on Rails

    4884questions

    Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

  • Ruby on Rails 4

    2116questions

    Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

  • RubyGems

    238questions

    RubyGemsはRubyによるプログラミングのためのパッケージマネジメントツールです。ユーザはこれを使用することで、Rubyライブラリのダウンロードやアップデートや、依存関係の自動解決が可能になります。

rails カウント数を表示

解決済

回答 1

投稿 2016/12/23 13:27

  • 評価
  • クリップ 0
  • VIEW 390

NishidaRyu416_

score 79

カウント数を表示するようにしたい

具体的には、あるuserが作ったwordが、favoriteされた数

model

class Word < ActiveRecord::Base

  acts_as_taggable
  validates :question,presence:true,length: { minimum: 2 }
  validates :answer,presence:true,length: { minimum: 2 }
  validates :title ,presence:true,length:{minimum:2}
  validate  :tag_list_tag_validation

  belongs_to :group
  belongs_to :user
  has_many  :favorites,dependent: :destroy

  def tag_list_tag_validation
     tag_validation = tag_list
     tag_validation.split(",")
     if tag_validation.length < 1
       errors.add(:tag_list, "タグを入力してください")
     end
     if tag_validation.length < 2
       errors.add(:tag_list, "タグは2個以上入力してください")
     end
     if tag_validation.length > 5
       errors.add(:tag_list, "タグは5個までです")
     end
  end

  def favorite?(user)
    favorites.where(user_id: user.id).exists?# exists?の説明 user.idが一致する人を探す。いたら、true いなかったら false
  end



  scope :with_keywords, -> keywords {
     if keywords.present?
       columns = [:question,:answer,:title]
       where(keywords.split(/[[:space:]]/).reject(&:empty?).map {|keyword|
         columns.map { |a| arel_table[a].matches("%#{keyword}%") }.inject(:or)
       }.inject(:or))
     end
  }
end
class User < ActiveRecord::Base

  before_save { self.email = self.email.downcase }
  validates :name, presence: true, length: { maximum: 50 }
  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
  validates :email, presence: true, length: { maximum: 255 },
                    format: { with: VALID_EMAIL_REGEX },
                    uniqueness: { case_sensitive: false }

  validates :local, absence: true,
                       on: :create
  validates :local, allow_blank: true, 
                       length: { minimum: 2, maximum: 20 }, 
                       on: :update

  validates :profile, absence: true, #入力を許さない
                       on: :create
  validates :profile, allow_blank: true,  #空文字のときバリデーションスキップ
                       length: { minimum: 2, maximum: 100 }, 
                       on: :update

  has_secure_password

  has_many :words
  has_many :groups
  has_many :tests

  has_many :following_relationships, class_name:  "Relationship", foreign_key: "follower_id", dependent: :destroy
  has_many :following_users, through: :following_relationships, source: :followed
  has_many :followed_relationships, class_name:  "Relationship", foreign_key: "followed_id", dependent: :destroy
  has_many :followed_users, through: :followed_relationships, source: :follower

  has_many :favorites, dependent: :destroy
  has_many :favorite_users, through: :favorites, source: :word

  has_many :tests, dependent: :destroy
  has_many :tests_users, through: :favorites, source: :word

  has_many :relation_groups,dependent: :destroy
  has_many :relation_users,through: :relation_groups,source: :word

  # 他のユーザーをフォローする
  def follow(other_user)
    following_relationships.find_or_create_by(followed_id: other_user.id)
  end

  # フォローしているユーザーをアンフォローする
  def unfollow(other_user)
    following_relationship = following_relationships.find_by(followed_id: other_user.id)
    following_relationship.destroy if following_relationship
  end

  # あるユーザーをフォローしているかどうか?
  def following?(other_user)
    following_users.include?(other_user)
  end
end
class Favorite < ActiveRecord::Base
  belongs_to :user
  belongs_to :word

  validates :user, presence: true
  validates :user_id, uniqueness: { scope: :word_id }
  validates :word, presence: true
end

controller

class UsersController < ApplicationController
  before_action :logged_in_user,except:[:new,:create,:userwords,:favorites]
  before_action :set_params, only: [:show, :edit, :update,:favorites,:userwords]
  before_action :correct_user, only: [:edit, :update ,:favorites]

  def show
    @val=@user.words.favorites(@user)
  end

  def new
    @user = User.new
  end

  def create
    @user = User.new(user_params)
    if @user.save
      flash[:success] = "Welcome to Share-単!"
      redirect_to @user
    else
      render 'new'
    end
  end

  def edit
  end

  def update
    if @user.update(user_params )
      flash[:success] = "Completion!"
      redirect_to @user
    else
      render 'edit'
    end
  end

  def userwords
    @title = 'user_words'
    @words = @user.words.order('created_at desc')
    @user.favorites.each do | favorite |
      if !@words.include?  favorite.word
        @words << favorite.word
      end
    end
    render 'words'
  end

  def favorites #favoriteの集合体
    @title = 'favorite_words'
    @words = @user.favorite_users.order('created_at desc')
    render 'words'
  end

  private
  def set_params
    @user = User.find(params[:id])
  end

  def user_params
    params.require(:user).permit(:name, :email, :password,
                                 :password_confirmation,:local ,:profile)
  end

  def correct_user
    redirect_to root_path if @user != current_user
  end
end

view

<div class="user-profile">
  <div class="icon">
    <%= gravatar_for user, size: 100 %>
  </div>
  <div class="name">
    <h1><%= user.name %></h1>
  </div>
  <div class="status">
    <ul>
      <li>
        <div class="status-label">Followings</div>
        <div class="status-value">
          <%= user.following_users.count %>
        </div>
      </li>
      <li>
        <div class="status-label">Followers</div>
        <div id="followers" class="status-value">
          <%= user.followed_users.count %>
        </div>
      </li>
      <li>
        <div class="status-label">作成問題数</div>
        <div id="want_count" class="status-value">
          <!--TODO-->
          <%=user.words.count%>
        </div>
      </li>
      <li>
        <div class="status-label">お気に入り</div>
        <div id="have_count" class="status-value">
          <!--TODO-->
          <%=user.favorites.count%>
        </div>
      </li>
      <li>
        <div class="status-label">お気に入りされた数</div>
        <div id="have_count" class="status-value">
          <!--TODO-->
          <%=@val%>#ここに表示したい
        </div>
      </li>
    </ul>

    <%= render 'users/follow/follow_form' if logged_in? && @user != current_user %>
    <br>
    <%= link_to @user.name + "さんの単語帳",userwords_user_url, class:"btn btn-info"%>
  </div>
</div>

回答よろしくお願いします

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

Viewで表示する前にコンソールで目的の数字が取得できるか確認したほうが良さそうです。

具体的には、あるuserが作ったwordが、favoriteされた数

↑は、このコードで取得できますか?

user = User.first
word_ids = user.words.map(&:id)
user.favorites.where(word_id: word_ids).count

投稿 2017/01/12 11:53

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/13 00:58

    すみません。
    解決済みでした。
    丁寧にありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

ただいまの回答率

91.47%

関連した質問

同じタグがついた質問を見る

  • Ruby

    5039questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

  • Ruby on Rails

    4884questions

    Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

  • Ruby on Rails 4

    2116questions

    Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

  • RubyGems

    238questions

    RubyGemsはRubyによるプログラミングのためのパッケージマネジメントツールです。ユーザはこれを使用することで、Rubyライブラリのダウンロードやアップデートや、依存関係の自動解決が可能になります。