はじめに
備忘録です。
ここでは、ホーム画面("/")で
「データ全件」
「1つのデータに関連付けされているデータの総数」
「1つのデータに関連付けされているハッシュのデータ」
を表示させたいとして、indexアクションにて上記のデータを取得する方法について見ていきます。
例えばQiitaのようなアプリケーションを作成するとするならば、
「記事全件」
「1つの記事に関連付けされているコメントの総数」
「1つの記事に関連付けされているタグのハッシュデータ」
を取得していくようなイメージです。
全てのデータはハッシュとして取得します。
環境
Ruby: 2.6
Rails: 5.2
モデルの例(作成の過程は省略)
コード
1.まずは記事全件を取得する
def index
@all_article = Article.all
end
2.1つの記事に関連付けされているコメントの総数を取得する
def index
@all_article = Article.all
# [ { 1: "コメント数" }, { 2: "コメント数" }, ... ]という形のデータを作成する。
# article.commentsでループ処理した記事データからコメントを呼び出している。
@article_count = @all_article.map{ |article|
[article.id, article.comments.count.to_s] #もしコメント数を表示させるならto_sで文字列化する。
}.to_h
# 上記のコメントデータのidと記事のidが一致した場合に、コメント数をcount属性に格納する
@article_count.map do |key, value|
@all_article.map do |article|
if article.id === key
article["count"] = value
end
end
end
# => [ { "id": 1, "count": "コメント数" }, { "id": 2, "コメント数" }, ... ]のように得られる
end
3.1つの記事に関連付けされているタグのハッシュデータを取得する(上と大体一緒)
def index
# 記事全件
@all_article = Article.all
# コメント数
@article_count = @all_article.map{ |article|
[article.id, article.comments.count.to_s]
}.to_h
@article_count.map do |key, value|
@all_article.map do |article|
if article.id === key
article["count"] = value
end
end
end
# 1つの記事が所有するタグをハッシュで取得
@all_article.map{ |article|
[article.id, article.article_tags.all]
}.to_h
# => {
# "1": [
# { "id": 1, "tag_name": "Rails" },
# { "id": 2, "tag_name": "React" },
# ... ,
# ],
# "2": [
# { "id": 1, "tag_name": "JavaScript" },
# { "id": 2, "tag_name": "Qiita" },
# ... ,
# ]
# }
end
以上ですが、上のままだとコントローラがごちゃごちゃしてしまうので、モデルファイルにインスタンスメソッドとして抽出するなどすると良いかと思います。
最後に
バックエンドとフロントエンドを切り離してSPAアプリケーションを作成する際にはビューファイルは使わないので、ルートのURLを持つホーム画面でアソシエーションされているデータを取得する方法を見つけるのにとても苦労しました。
で、結果このようにする結論に辿り着いたのですが、間違いやもっといい方法があるなどあれば、是非教えて頂けるととても助かります!🙇♂️