初めて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投稿ごとに情報の有無で表示を変えることができました!