LoginSignup
0
0

More than 1 year has passed since last update.

exists? メソッドを使った簡単な条件分岐

Posted at

初めてexistsメソッドを使ったのでメモ

existsメソッドとは

exists?メソッドとは指定した条件のレコードがデータベースに存在するかどうかを真偽値で返すメソッドです。存在すればtrueを存在しなければfalseを返します。
書き方は、

  オブジェクト.exists?(条件)
    モデル名や、モデルクラスのインスタンスなどを指定できます。

何故使おうと思ったか

結論から言うとコメントの表示で気になることがあったため。

写真投稿サイトをつくっており、投稿に対するコメントを追加できるようにしています。
コメントが多くなることを想定しているのでページネーションを用いています(gem 'kaminari')
コメントは

@comments = Commnet.all

で取得してそれをviewで対応するidだけを表示するようにしています。

ページネーションを作っていなければ、今回の問題に当たっていなかったので作っていてよかったと思いました。

問題としましては投稿にコメントが追加されていないのにページネーションが表示されている点です。

これを投稿にコメントが追加されてから表示するようにしたいので考えました。

試したこと

viewでは以下のようにしていますがこの"each"の中にページネーションの記載をするとコメントの数だけページネーションが表示されてしまいます。
それではいけないのですが、指定する条件はこれが理想なんですよね〜、

<% @comments.each do |comment| %>
  <% if @post.id == comment.post_id %>
  ~ #コメントにある外部キーと投稿のidが同じものだけ表示している

<% end %>

どうしたもんか。。

ググってみました。

どう検索したらいいかわかんなかったのでデータベースの有無に関するメソッドを見てました。
(present? とか blank? とか)

それみてたら

existsを見つけました!
このメソッドは条件に対して true か falseを返すので、

  User.exists?(name: "田中")
Userのnameカラムに田中があればtrue, なければfalse
=> true

みたいに使うことができます。

僕が考えている条件としては、
コメントをつける投稿の主キー id と
コメントが持つ、外部キー post_idが同じ というものです。

つまり,,,,,,
Comment.allの情報を入れた @comments の post_idカラムのなかに コメントをつける投稿のidがあるかないかの処理を書けばいいのです。
post_idはcommentをcreateした時に追加されるのでコメントがなければpost_idは追加されません。

書いてみる

<div>
 <% if @comments.exists?(post_id: "#{@post.id}") %>
  #commentsのpost_idを全検索して投稿ごとのidを調べてtrueかfalseを返す

  ##trueなら表示
   <%= paginate @comments %>

 <% else %>

  ##falseなら表示
   <p>コメントはまだありません。</p>

 <% end %>
</div>

これで他の投稿と競合せずに1投稿ごとに情報の有無で表示を変えることができました!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0