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

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

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

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

Ruby on Rails 4

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

Q&A

解決済

2回答

1913閲覧

Rails モデル定義 マイグレーション記述

takeroyasuhara

総合スコア15

Ruby on Rails

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

Ruby on Rails 4

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

0グッド

0クリップ

投稿2015/08/07 12:56

  • 以下のクラス定義をRailsモデルとして定義してマイグレーション記述したいのですが、どう書けば良いか、ご教示いただけないでしょうか。
  • 自分なりに考えた回答も書いておりますが、他のより良い方法がないか、考えたいと思っています。
元のクラス定義

Ruby

1class Teacher 2 attr_reader :id, :name, :courses 3 4 def initialize(id, name, courses) 5 @id = id 6 @name = name 7 @courses = courses 8 end 9 10end 11 12class FullTimeTeacher < Teacher 13end 14 15class PartTimeTeacher < Teacher 16 attr_reader :working_days 17 18 def initialize(id, name, courses, working_days) 19 @id = id 20 @name = name 21 @courses = courses 22 @working_days = working_days 23 end 24 25end
自己回答
  • STIを利用してクラスの継承関係を表現しています

Ruby

1class CreateTeachers < ActiveRecord::Migration 2 create_table :teachers do |t| 3 t.string :name 4 5 t.timestamps null: false 6 end 7end 8 9class CreateCourses < ActiveRecord::Migration 10 create_table :courses do |t| 11 t.string :code 12 13 t.timestamps null: false 14 end 15end 16 17class CreateAssignments < ActiveRecord::Migration 18 create_table :assignments do |t| 19 t.integer :teacher_id 20 t.integer :course_id 21 22 t.timestamps null: false 23 end 24end 25 26class Teacher < ActiveRecord::Base 27 has_many :assignments 28 has_many :courses, through: :assignments 29end 30 31class Course < ActiveRecord::Base 32 has_many :assignments 33 has_many :teachers, through: :assignments 34end 35 36class Assignment < ActiveRecord::Base 37 belongs_to :teacher 38 belongs_to :course 39end

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

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

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

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

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

guest

回答2

0

ベストアンサー

質問文にある自己回答の方法で十分とおもいます。
ただ、working_days の情報が DB に反映できていないように思えました。

teacher --> working_day を has_many 関係でつくってあげる必要があると思います。

さらに teachers テーブルに判定用の boolean 項目を追加することも必要です。
(has_many で working_day の情報を管理するようにした場合、 working_day の取得結果が 0 個なのを
FulltimeTeacher と判定するのは、多分うまくいかない。
全ての曜日が付加になった場合に Fulltime と判定されてしまうことになるので。
かといって、FullTimeTeacher に対して 全部の日を登録するのはデータの無駄とおもいます)

投稿2015/08/08 02:07

katoy

総合スコア22324

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

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

takeroyasuhara

2015/08/08 05:12

回答いただきありがとうございました。teachers テーブルに booleanカラムを追加して、FullTimeTeacherかPartTimeTeacherか区別するということでしょうか?
katoy

2015/08/08 13:35

はい、そうです。
takeroyasuhara

2015/08/11 12:58

ご回答いただきありがとうございました。
guest

0

FullTimeTeacherPartTimeTeacherの違いはworking_daysがあるかないかだけなので、
Single Table Inheritance を利用するのが良いように思いました。

http://dev.classmethod.jp/server-side/ruby-on-rails/rails-sti-with-one-controller/


すいません、STIって書いてありましたね。見落としてました。

投稿2015/08/07 13:29

編集2015/08/07 13:30
hello-world

総合スコア1342

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

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

takeroyasuhara

2015/08/07 14:03

ご回答いつもありがとうございます! そうなんです、STIを利用して書いてみたのですが、他に方法がなさそうか、考えておりました。
hello-world

2015/08/07 14:08

他の方法としては、こんな感じでしょうか。 - has_one 関係のテーブルを`working_days`のためだけに作る - RDBMSのテーブル継承機能を使う(とりあえずPostgreSQLは可能) どちらもSTIと比べると不便なように思います。
takeroyasuhara

2015/08/08 05:13

ご回答いただきありがとうございます。あげてくださっているやり方でも考えてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問