現在作っているウェブアプリで、記事を投稿したユーザーの画像と名前をサイドバーに一覧表示したい!と思って使ったメソッドの話です。
まずやってみたのは、controllerで投稿ユーザーの情報をインスタンス変数 @post_usersに代入。
def post_users
@post_users = Post.select(:user_id)
end
その後、viewのファイルで@post_usersから要素を取り出して表示。
しかしこのやり方だと(当然ですが)ブログの投稿の数だけユーザーの写真と名前が表示されてしまいます(写真ではuserの象が2つ出てきている)。
そこで使ったのがdistinctメソッドです。Railsガイドにも記述がありました。
https://railsguides.jp/active_record_querying.html
(下記Railsガイドより)
特定のフィールドについて、重複のない一意の値を1レコードだけ取り出したい場合、distinctを使用できます。
Client.select(:name).distinct
上のコードを実行すると、以下のようなSQLが生成されます。
SELECT DISTINCT name FROM clients
「重複のない一意の値を1レコードだけ取り出したい場合」というのがいかにもRailsガイドっぽい言い回しの気がしますが、、、要するに
モデル.select(:取得する列).distinct"
の形にすれば、重複した要素をはじいてくれるようです。早速controllerにdistinctを追加。
def post_users
@post_users = Post.select(:user_id).distinct
end