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

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

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

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

Q&A

解決済

1回答

5580閲覧

railsで、カラム名と同じ名前のモデルのデータ一覧を表示させる方法を教えてください。

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby on Rails 4

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

0グッド

0クリップ

投稿2016/05/27 15:11

###前提・実現したいこと

Jobsモデルがあり、カラムには職業名が入っています。
Jobsモデルのカラムの職業と同名のモデルがあります。

例:
Job name:"Police","Rescue"

Police job_type: "guard","driver","etc","etc"...
Rescue job_type: "driver","ladder","medical","etc","etc"...

indexからjobsの一覧を表示させて、showを開いたときに、カラムに登録されたjob_typeと一致するモデルのデータ一覧を表示したい。

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

views/jobs/index <% @jobs.each do |job| %> <%= link_to job.name %> <% end %>

job.nameのlinkをクリックしshowへ移動。

views/jobs/showの中身 <strong>Name:</strong> <%= @jobs.name %> <strong>役割</strong> <!--ここへ@jobs.nameと同じモデル名の役職データを出力したい -->
表示例: name:Police ・guard ・driver ・etc...

###試したこと1

Jobクラスへ has_many :polices, has_many :rescuesと記述
policeクラスへ belongs_to :job,rescueも同様
そこから、showへ記述しようにも、どうやって記述するのやら途方に暮れる

参考テラテイルの質問

この質問を参考にしてみるも、この場合は対象のモデル名がarticleと解っているが、今回は選択毎に変わるので解らない・・・

###試したこと2

これで、動くのは動いたけど・・・・すっきりしない

jobコントローラー def show class_name = ActiveRecord::Base.connection.tables.grep (@user.name) #set_paramsで取得した:idの名前と、同じモデルを探してくる job = Object.const_get(class_name[0].capitalize)#オブジェクトに変換 @jobs = job.all end
views/jobs/showの中身 <strong>Name:</strong> <%= @user.name %> <ul> <% @jobs.each do |job| %> <li><%= job.job_type %></li> <% end %> </ul>
実際の画面 Name: police ・guard ・driver ・etc

###悩み

試したこと1の参考のようなスマートな方法を教えてください。

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

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

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

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

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

rifuch

2016/05/31 08:07

ぱっと見た時点で、設計が良くないのがスマートに書けない原因なのですが、ここに示されている以外の要件があって、この設計になっているのではと思います。 ここに書かれている以外の要件があれば、それを示してもらえれば、何かアドバイスが出来るかもしれません。
退会済みユーザー

退会済みユーザー

2016/06/01 07:02

学習用で自分で考えてみただけなので、その他の要件というのはありません;;。子に当たるモデルPOLICE,RESCUEなどをわけている理由としては、子モデルのカラムが職業が違うとその職業にあったカラムを増やさないといけないと思ったので、そんなに増えてしまうなら、職業別にモデルを作って管理してしまったほうがいいのでは?一つのモデルでまかなうとなるとカラムが増えすぎて管理しずらいのでは?と思いこうなった所存です。こういうシチュエーションの場合にスマートな設計があればご教授いただければ参考になります。
guest

回答1

0

ベストアンサー

コメントに、このようなモデル設計になった理由は特にない、との事だったので、
スマートに出来ない理由は「設計がよくないから」です。

私もやるとしたら「試した事2」の方法になります。
モデルのインスタンスに入っている属性から、クラスやメソッドを抽出してconst_getしたり、sendしたり、method_missingをオーバーライドする技法は、メタプログラミング的でRubyの真骨頂ともいえます。
しかし、頻発するようだったりすると、大体は設計ミスが疑われます。

データモデリングに関しては、奥が深すぎて回答欄に書けるようなものではないので、
自分で書籍や各種サイトで情報を集めて勉強するしかないのですが、
どんな簡単なシステムでも、コードを書き始める前に、
ざっとしたクラス図と、ユースケース図を書くようにすると、
大きな間違いは起きない気がします。

試しに、サンプルのクラス図を書けるかどうか、トライしてみると良いかと思います。
その上で、何が怪しいのか、どこがふわふわしているせいでおかしくなっているのかを考えてみるのは、
良い学習になるかと思います。

投稿2016/06/01 08:25

rifuch

総合スコア1901

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

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

退会済みユーザー

退会済みユーザー

2016/06/02 10:12

試したこと2の方法はありなんですね。 動くだけではRails的ではないのかと思い敬遠していました。 参考になりました。ありがとうございます。
rifuch

2016/06/02 11:21

なんだか主観的な話になりますが、メタプログラミングはRuby的ではありますが、Rails的ではないですね。むしろ、RailsがRubyのメタプログラミング的な部分を駆使して作られているという感じです。 Railsでは、むしろ避けるべきで、どうしようもない場合はそれを使うのはやぶさかではない、という事です。 メタプログラミングを導入してそれに慣れてゆくと、非常に便利だし、なんだか俺スゲーなコードを書けるので、癖になってしまうんですが、後からコードの見通しの悪さに苦しむ事になります。 乱用注意ですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問