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

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

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

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

Ruby on Rails

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

Q&A

解決済

2回答

1206閲覧

Rails enumで設定した職業を指定してメールアドレスを取得したい

Kassy11

総合スコア26

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2019/07/12 02:07

現在Ruby on Railsで、Userクラスから職業ごとのメールアドレスを取り出すという機能を実装しています。

Userモデルのカラムは、
id:integer,name:string,mail:string,role:integer
となっていて、
Userクラスで

ruby

1enum proffesion: {director: 0,software_engineer: 1,hardware_engineer: 2, 2 designer: 3, sales: 4, customer_relation: 5} 3 4 def self.mail_by_role(param)#キーを渡す 5 role_num = self.proffesions["#{param}"] 6 user = self.where(role: role_num)#enumの番号を元にユーザを探す 7 user.mail 8 end 9

と実装しているのですが、
rails c -sでUserをroleありで登録した後、このクラスメソッドを実行しても職業ごとのメールを取得できません。
どのようにコードを書き換えればよいでしょうか?

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

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

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

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

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

guest

回答2

0

where(role: param.to_sym)

投稿2019/07/12 06:19

winterboum

総合スコア23329

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

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

0

ベストアンサー

rb

role_num = self.proffesions["#{param}"]

こんなことしてたらenumにした意味がない。

rb

user = self.where(role: role_num)

rb

1user.class 2#=> User::ActiveRecord_Relation 3user.email 4# NoMethodError

になると思います、多分。

ActiveRecordクエリインターフェイス
ActiveRecord::Enum

ruby

1def self.mail_by_role(param) 2 where(role: professions[param]).pluck(:mail) 3end

もしくは

rb

1enum role: { director: 0, software_engineer: 1, hardware_engineer: 2, designer: 3, sales: 4, customer_relation: 5 } 2 3def self.mail_by_role(param) 4 where(role: param).pluck(:mail) 5end

こちらの方が望ましい。

投稿2019/07/12 04:54

編集2019/07/12 07:02
Mugheart

総合スコア2344

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

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

Kassy11

2019/07/12 05:29

where(role: professions["#{param}"]).plunk(:mail) でしょうか??
Mugheart

2019/07/12 05:36 編集

惜しいですね。 where(role: :director) みたいに検索できるので where(role: param).pluck(:mail) でいけると思います。 検証してないですが...。 plunk => pluck (typoしてます)
Kassy11

2019/07/12 05:59

where(role: param).pluck(:mail) として、コンソールでUser.mail_by_role(:designer)とすると [["role", nil]] => [] User.mail_by_role("designer")とすると [["role", 0]] となってしまいます
Mugheart

2019/07/12 06:17

それはSQL文ではなくて? 戻り値が [["role", 0]] になっているってことですか?
Kassy11

2019/07/12 06:24

default を0にしているので、戻り値は全てのメールアドレスが返ってきます
Mugheart

2019/07/12 06:29

あぁ、わかりました。 enum proffesion: { ... } とあるんですが、ここって enum role: { ... } ではないんですね...。 enumをどういう風に使ってらっしゃるか把握できてないですが この書き方であれば where(role: professions[param]).pluck(:mail) と書かざるをえないですね。失礼しました。
Kassy11

2019/07/12 06:42

そのようにしてもやはりうまくいかないです、、、
Mugheart

2019/07/12 06:57 編集

どううまくいかないのか伝えてもらわないと...。 僕は professions って書きましたが、ファイルやコメントみると proffesions ってなってますね。 おそらくtypoだと思いますが、エラーとかも出てるはずなのでちゃんと伝えてください。 書き方がそもそも間違っているのか、単なるtypoなのかで考える内容も時間もかなり変わるので。
Kassy11

2019/07/12 07:19

タイプミスが多く申し訳ないです rails conosoleでuser1 = User.first としたものに user1.role = 1とし User.mail_by_role(”software_engineer”)とすると [["role", 1]] => [] と帰ってきてしまいます
Mugheart

2019/07/12 07:30

user1.role = 1 した後に user1.save しましたか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問