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

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

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

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

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Q&A

解決済

1回答

8233閲覧

【Rails】boolean型カラムを複数もつモデルから、値がtrueのデータのみを一気に取得しviewで表示することはできますか?

jusco

総合スコア80

Ruby

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

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

0グッド

0クリップ

投稿2015/07/28 09:35

編集2015/07/28 09:39

以下の様なデータを持つStatusモデルから、trueを持つカラムのみを取得し、そのカラム名を表示させたいです。

Ruby

1class Status < ActiveRecord::Migration 2 def change 3 create_table :status do |t| 4 t.boolean :A ,default: true 5 t.boolean :B ,default: false 6 t.boolean :C ,default: false 7 t.boolean :D ,default: false 8 t.boolean :E ,default: false 9 t.boolean :F ,default: false 10 end 11 end 12end

上記のStatusモデルはUserモデルと1対1の関係を持つ子モデルです。
あるUserのプロフィールを表示する際に、Statusモデルの持つカラムの中から値がtrueのカラム名のみを取得し、同時に表示させることはできるのでしょうか?

また、その際にカラム名も取得し、日本語にした上でviewで表示もしたいです。

表示としては、

状態:エー、ビー、ディー

のようにviewで表示したいです。(:A,:B,:Dがtrueの場合。)

ブロックやロケールを使えばできるような気もするのですが、理解が浅く、その記述方法がわかりません。
希望通りの実装が可能であれば、その方法を具体的に教えていただきたいです。

この「状態」というデータについては、量も多く開発途中で変更がある可能性があることに加え、各「状態」を持つユーザーを検索する、という機能も実装したいために、enumよりもモデル管理の方がいいのかなと考えていましたが、
複数選択できるデータを持つためにもっといい方法があるよ、という場合もご教示いただけると嬉しいです。

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

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

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

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

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

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

guest

回答1

0

ベストアンサー

lang

1class CreateStatus < ActiveRecord::Migration 2 def change 3 create_table :status do |t| 4 t.integer :user_id 5 t.boolean :a ,default: true 6 t.boolean :b ,default: false 7 t.boolean :c ,default: false 8 t.boolean :d ,default: false 9 t.boolean :e ,default: false 10 t.boolean :f ,default: false 11 end 12 end 13end

大文字はRuby的に面倒なので上のようなコードとして話を進めます。

そうすると翻訳ファイルはこんな感じで

lang

1ja: 2 activerecord: 3 attributes: 4 status: 5 a: 'エー' 6 b: 'ビー' 7 c: 'シー'

モデルのコードはこんな感じで(修正しました)

lang

1class User < ActiveRecord::Base` 2 has_one :status 3end 4 5class Status < ActiveRecord::Base 6 FLAG_FIELDS = [:a, :b, :c, :d, :e, :f] 7 belongs_to :user 8 9 def true_flags 10 ret = [] 11 FLAG_FIELDS.each do |flag_name| 12 if self[flag_name] 13 ret << flag_name 14 end 15 end 16 ret 17 end 18 19 def i18n_true_flags 20 true_flags.map{ |flag_name| Status.human_attribute_name(flag_name) } 21 end 22end

ビューのコードはこんな感じでしょうか。

lang

1<%= user.name %>さんこんにちは<br> 2有効な機能は <%= user.status.i18n_true_flags %> です。

投稿2015/07/28 09:51

編集2015/07/28 12:20
hello-world

総合スコア1342

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

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

jusco

2015/07/28 10:30

早速のご回答ありがとうございます!! ご指導頂いた通り実装したところ、配列の表示と日本語化はうまくいきました! しかし、trueでない値も含めて、FLAG_FIELDSに含まれるカラム全てが表示されてしまっています...。 trueであるかどうかの確認ができていないのでしょうか…。 もう少し弄ってみます。
hello-world

2015/07/28 11:49

実際にうまくいかない Status のフィールドを確認してもらえますか? rails console 上で p user.status[:f] とやって出力される値が false だったら良いのですが、 0 だったり文字列の "false" だったりすると(Rubyではtrueと判断されるため) if 文が想定通りに動作しません
jusco

2015/07/28 12:18

false => false と表示されています。 データベースの問題だとすれば、postgresqlを使用しているのが問題なのでしょうか?
hello-world

2015/07/28 12:20 編集

ごめんなさい、私のミスです! true_flags メソッドを直しました。
jusco

2015/07/28 12:27

ありがとうございます!! 修正内容を反映したところ、うまく実装できました!!! 長くに渡って丁寧に対応して頂き、ありがとうございましたm(__)m 助かりました!(T_T)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問