【Rails】Active Storageでハマったレコードの取得

公開日:2018-11-12
最終更新:2018-11-12

個人開発のWebアプリ「まちかどルートをv3.7にバージョンアップしました。

今回の新機能は「メディア」です。

ユーザーが投稿したサブクエストの中から、未クリアの写真付きサブクエスト(つまり写真付きandコメントなしの投稿)を一覧表示します。今回そうしたデータをどうやって絞り込んで取得したのかをまとめました。

Active Storageでハマった

写真付きで投稿可能にするためRails 5.2の新機能のひとつ、いわゆるファイルアップローダーのActive Storageを使っているのですが、レコードの取得方法でハマりました。意外とインターネットに情報がないようです(自分の検索スキル不足かも...)。

モデルの構造を把握してみた

こちらの記事に詳しく図解されていますが、Active Storageでは複数のモデルがアソシエーション(関連付け)の構造となっています。

レコードを取得してみた

けっきょく下記のようなコードで取得できました。

<% @images = ActiveStorage::Attachment.order(Arel.sql('random()')).limit(50).pluck(:record_id) %>

<% @posts = Post.where(id: @images) %>

<% @posts.shuffle.first(20).each do |post| %>
    <% if Comment.find_by(post_id: post.id, user_uid: session[:id]) %>
    <% else %>
        <%= link_to post_path(post) do %>
        <%= image_tag post.image.variant(resize: "246x200") %>
        <% end %>
    <% end %>
<% end %>

ActiveStorage::Attachment

<% @images = ActiveStorage::Attachment.order(Arel.sql('random()')).limit(50).pluck(:record_id) %>

肝心なのはモデル名をActiveStorage::Attachmentとして指定する必要があったということです。さらにrecord_idが投稿のidと紐づいていたのでpluck()を付ければ写真付きの投稿のidを抽出できました。

ちなみにここではランダムArel.sql('random()')で最大50件limit(50)という条件も付けています。

<% @posts = Post.where(id: @images) %>

写真付きの投稿のidを@imagesに配列として収納できたので、あとはそれを条件にしてwhereで実際の写真付きの投稿データを取得しました。

補足

<% @posts.shuffle.first(20).each do |post| %>
(中略)
<% end %>

まちかどルートの「メディア」では最大50件の投稿のうち20件をシャッフルして表示しています。

<% if Comment.find_by(post_id: post.id, user_uid: session[:id]) %>

コメントのあるなしはここで判断しています。

以上です。
Active Storageのモデルからデータを絞り込んで取得するようなコードを書いたのは今回が初めてだったので勉強になりました。ひきつづき少しずつ学んでいきます。

記事が少しでもいいなと思ったらクラップを送ってみよう!
18
+1
@west2538onRailsの技術ブログ

よく一緒に読まれている記事

0件のコメント

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

技術ブログをはじめよう

Qrunch(クランチ)は、ITエンジニアリングに携わる全ての人のための技術ブログプラットフォームです。

技術ブログを開設する

Qrunchでアウトプットをはじめよう

Qrunch(クランチ)は、ITエンジニアリングに携わる全ての人のための技術ブログプラットフォームです。

Markdownで書ける

ログ機能でアウトプットを加速

デザインのカスタマイズが可能

技術ブログ開設

ここから先はアカウント(ブログ)開設が必要です

英数字4文字以上
.qrunch.io
英数字6文字以上
ログインする