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

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

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

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

Q&A

解決済

2回答

2771閲覧

Railsでhashから条件に一致したkeyの、隣のkeyから値を取得する方法

sakura_saku

総合スコア7

Ruby on Rails

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

0グッド

0クリップ

投稿2017/11/18 10:27

編集2017/11/18 11:26

###前提・実現したいこと
Railsでhashから条件に一致したkeyの、隣のkeyから値を取得する方法を知りたいです。
もしくは、このhashの構造を変えたほうがいいなどあれば合わせてご指導頂きたいです。

###該当のソースコード

HASH = [ { id: 1, name: 'yamada' }, { id: 2, name: 'tanaka' } ]

このようなhashから、 id: 1と一致していたら nameのkeyから値を取得したいと考えていますが、このような場合、Railsではどのように取得するのが一般的でしょうか?

###試したこと

id: 1に一致したnameを取得する場合はこんなイメージでいました

# controller @test = HASH.find(1)[:name]

###補足情報(言語/FW/ツール等のバージョンなど)
ruby 2.4.0
Rails 4.2.7.1

よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

rb

1# id == 1が含まれてない可能性および:nameが無い可能性がある場合 2HASH.find{|it| it[:id] == 1}&.fetch :name 3 4# idが必ずある場合 5HASH.find{|it| it[:id] == 1}.fetch :name 6 7# idもnameも必ず存在する場合 8HASH.find{|it| it[:id] == 1}[:name]

投稿2017/11/18 12:17

asm

総合スコア15147

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

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

sakura_saku

2017/11/18 14:09

なるほど!ありがとうございます! 通常時以外のパターンも記載いただき勉強になります
guest

0

map, collect, each_with_object を使って書いてみました。

a.rb

ruby

1data = [ 2 { id: 1, name: 'yamada' }, 3 { id: 2, name: 'tanaka' } 4] 5p data.map { |hash| hash[:name] if hash[:id] == 1 }.compact 6p data.collect { |h| h[:name] if h[:id] == 1 }.compact 7p data.each_with_object([]) { |hash, memo| memo << hash[:name] if hash[:id] == 1 } 8puts 9 10data = [ 11 { id: 2, name: 'tanaka' } 12] 13p data.map { |hash| hash[:name] if hash[:id] == 1 }.compact 14p data.collect { |h| h[:name] if h[:id] == 1 }.compact 15p data.each_with_object([]) { |hash, memo| memo << hash[:name] if hash[:id] == 1 } 16puts 17 18data = [ 19 { id: 1, name: 'tanaka' }, 20 { id: 1, name: 'tanaka_2' } 21] 22p data.map { |hash| hash[:name] if hash[:id] == 1 }.compact 23p data.collect { |h| h[:name] if h[:id] == 1 }.compact 24p data.each_with_object([]) { |hash, memo| memo << hash[:name] if hash[:id] == 1 } 25 26

実行例:

$ ruby a.rb ["yamada"] ["yamada"] ["yamada"] [] [] [] ["tanaka", "tanaka_2"] ["tanaka", "tanaka_2"] ["tanaka", "tanaka_2"]

投稿2017/11/20 15:54

katoy

総合スコア22324

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問