質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

2回答

1367閲覧

コントローラー内での配列の要素を取り出し方

Masashige1005

総合スコア14

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2020/05/25 05:37

編集2020/05/25 06:42

カラムで保存されている配列から要素のidを再度、他のテーブルで検索をかけて
whereでまとめたいのですが、うまくできません。

controller

1 def show 2 @category_item = CategoriesItem.find_by(item_id: @item.id) 3 @small_category = Category.where(id: @category_item.small_category_id) 4 end

@category_itemの中身

Data

1 id: 1, 2 big_category_id: 8, 3 item_id: 51, 4 small_category_id: "[0, 15, 30, 35]", 5 created_at: Mon, 25 May 2020 02:34:19 UTC +00:00, 6 updated_at: Mon, 25 May 2020 02:34:19 UTC +00:00>

small_category_idの中身の[0,15,30,35]をCategoryテーブルでwhereをかけて
Categoryテーブルから情報を持ってきたい。

現在のやり方だと、変数の中身を見てみると毎回whereの中身が [] になってしまいます。
宜しくお願いします。

item

1 has_many :categories_items 2 has_many :categories, through: :categories_items 3 accepts_nested_attributes_for :categories_items

categoryitem

1 belongs_to :item, optional: true 2 belongs_to :category, optional: true

category

1 has_many :categories_items 2 has_many :categories, through: :categories_items

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

正しく、正規化および関連付けを行ってデータを作り直した方がいいです。

どうしても、このまま運用したいというのならば

ruby

1 def show 2 @category_item = CategoriesItem.find_by(item_id: @item.id) 3 @small_category = Category.where(id: YAML.parse(@category_item.small_category_id)) 4 end

これの何が駄目かというのを説明すると
複数件のCategoriesItemとそれに関連づいたCategoryを取得しようとした際に
データベースに複数回問い合わせが必要になるのが問題になりえます。

投稿2020/05/25 06:22

asm

総合スコア15147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Masashige1005

2020/05/25 06:45 編集

すみません、一応関連付けはしております。 載せるのを忘れておりました。 現在付け加えました。
guest

0

ベストアンサー

rb

1Category.where(id: "[0, 15, 30, 35]")

のように文字列で検索をかけてしまっているからではないでしょうか。

rb

1Category.where(id: [0, 15, 30, 35])

配列で検索をかけるようにすれば正しく動くようになると思います。

修正の方法はいくつかあると思いますが、
例えば PostgreSQL をお使いであれば以下のような設定で対処できると思います。

rb

1class Category 2 attribute : small_category_id, :integer, array: true

投稿2020/05/25 06:19

Mugheart

総合スコア2340

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Masashige1005

2020/05/25 06:30

integer型で配列って保存できますか? 少し前まではinteger型でsmall_category_idを定義していたのですが、うまくカラムに保存されないのでstring型にしました。ちなみにDBはmysql2を使用しております。 質問ばかりですみませんが、"[0, 15, 30, 35]" → [0, 15, 30, 35]の直し方も教えていただけると幸いです。 to_iだと一番前の0しか取得できなかったと思います。
Mugheart

2020/05/25 06:52 編集

asmさんも回答でおっしゃっていますが、そもそも一つのカラムに配列を突っ込むというのはRDBの運用上真っ当ではないです。 RDBのルールとして「1つのレコードの1つのカラムには単一のデータを入れる」というものがあるからです。 配列は構造を持ったデータなのでこのルールから外れています。 > "[0, 15, 30, 35]" → [0, 15, 30, 35]の直し方 いくつか方法がありますが、例えば JSON.parse("[0, 15, 30, 35]") "[0, 15, 30, 35]".delete('[]').split(', ').map(&:to_i) など。 eval("[0, 15, 30, 35]") でも可能ですが絶対にやめてください。 でもどちらにせよこれらはお勧めできません。 可能であればDBの設計を見直した方がいいです。
Masashige1005

2020/05/25 07:04

カラムに配列入れるのはあまり良くないのですね・・・ 今のテーブル設計上だと配列の方がまとまってる感じがしたので採用したのですが、配列から取り出すのは運用上良くないのは勉強になりました。 再度、DBの設計を検討し直します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問