BETA

【Sinatra】レコード数の取得

投稿日:2019-12-04
最終更新:2019-12-04

Sinatraでツイッタークローンを作る際に、投稿数、フォロー数、フォロワー数を取得して表示させてみます。
これらは、ユーザ詳細画面に表示させます。

チュートリアルの書き方ではcountを使えない

railsのチュートリアルには、countsという関数を作り、ユーザIDと紐づけている投稿内容を取得し、count することで、数字を表示しています。
こんな感じです。

  def counts(user)  
    @count_microposts = user.microposts.count  
  end  

countは、配列にしか使えないので、私のSinatraアプリでは使えませんでした。。。

これは投稿のレコード(Podtテーブル)の内容なのですが、USerテーブルとはuser_id だけの関係

UserテーブルにはPostのIDさえもない始末。

お互いのレコードを配列で持ち合うなんて関係じゃなかった。

ということで、地道にやっていきます。

DB構成

Usersテーブル

class CreateUsers < ActiveRecord::Migration[6.0]  

  def change  

    create_table :users do |t|   
      t.string :name  
      t.string :email  
      t.string :password_digest  
    end  
  end  
end  

Postsテーブル

class CreatePosts < ActiveRecord::Migration[6.0]  

  def change  

    create_table :posts do |t|  
      t.string :content  
      t.references :user, foreign_key: true  

      t.timestamps  
    end  
  end  
end  

Relationshipsテーブル

class CreateRelationships < ActiveRecord::Migration[6.0]  

  def change  

    create_table :relationships do |t|  

      t.references :user, foreign_key: true  
      t.references :follow, foreign_key: { to_table: :users }  

      t.timestamps  

      t.index [:user_id, :follow_id], unique: true  
    end  
  end  
end  

Usersテーブルに、Postsテーブルと、とRelationshiosテーブルが紐づいている状態です。

コントローラ

まず、コントローラの設定をします。

  get '/:id' do  
    @users = User.find(params[:id])  
    @current_user ||= User.find(session[:user_id]) if session[:user_id]  
    @post = Post.where(user_id: params[:id]).all  
    counts(@users)  
    erb :'user/show'  
  end  

ユーザidをurlに打ち込むとそのユーザの詳細画面が出ます。
ユーザ画面では、ユーザ名、そのユーザのPost(投稿)内容、Post(投稿)数、フォロー数、フォロワー数
を出力します。
counts(@users) で、@users を引数に、counts 関数を呼び出します。

counts関数

ヘルパーとして、counts関数を設定します。
同じコントローラ内に記述します。

helpers do  

  def counts(user)  
    posts [email protected] = Post.where(user_id: params[:id]).all  
    followers = Relationship.where(user_id: params[:id]).all  
    followeds = Relationship.where(follow_id: params[:id]).all  
    @post_cnt = posts.count  
    @follow_cnt = followers.count  
    @followed_cnt = followeds.count  
  end  

end  

処理の内容は全く同じなので、Post数についてだけ見ていきます。

posts [email protected] = Post.where(user_id: params[:id]).all で、該当ユーザが投稿したPostを全て取ってきます。
その変数に対して.count をかければ、配列の数字を取得できます。

まとめ

仕組みが分かれば簡単にできました!

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

初学者の成長が垣間見れます

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう