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

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

ただいまの
回答率

88.35%

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 3,290
退会済みユーザー

退会済みユーザー

前提・実現したいこと

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の参考のようなスマートな方法を教えてください。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • rifuch

    2016/05/31 17:07

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

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2016/06/01 16:02

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

    キャンセル

回答 1

checkベストアンサー

0

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/06/02 19:12

    試したこと2の方法はありなんですね。
    動くだけではRails的ではないのかと思い敬遠していました。

    参考になりました。ありがとうございます。

    キャンセル

  • 2016/06/02 20:21

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

    キャンセル

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

  • ただいまの回答率 88.35%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る