Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
1
Help us understand the problem. What is going on with this article?
@tmasuyama

Railsで新しくテーブルを作成するときの基本的な流れ

More than 1 year has passed since last update.

Railsで新しくモデルを作成するときの備忘メモ

マイグレーションファイルを作成

$ rails g model Test

マイグレーションファイルの編集

マイグレーションファイルを「rails g model Test」で作成すると、次のようなファイルが作成される。

yyyymmddHHMMSS_create_tests.rb
class CreateQuestions < ActiveRecord::Migration[5.2]
  def change
    create_table :tests do |t|

      t.timestamps
    end
  end
end

基本としては、create_table :tests do |t| から end の間に追加したいカラムの情報をつけていく。

ここでは、string型のtitleカラムと、inter型の No というカラムを追加させる。
なお、255文字以下の文字列ならば string 型、それ以上であれば text 型を使います。

yyyymmddHHMMSS_create_tests.rb
class CreateQuestions < ActiveRecord::Migration[5.2]
  def change
    create_table :tests do |t|
      t.string :title
      t.integer :No
      t.timestamps
    end
  end
end

これであとは「rails db:migrate」:を実行すれば、titleカラムとNoカラムとtimestampsカラムを持つ「Test」というテーブル(表のようなもの)が作成される。

マイグレーションファイルをデータベースに反映

$ rails db:migrate

モデルに制約をつけていく

通常、作成したモデルに入れる情報(ここではテーブルに入るデータのようなイメージ)には、好き勝手な情報を入れられないように制約(validates)をつけてあげます。
ちなみにモデルファイルを編集したあとは、特にコマンドを実行する必要はありません。

次の例は、空のタイトルが入力されないように Test モデルに制約(バリデーションといいます)をつける例です。

¥app¥models¥test.rb
class Question < ApplicationRecord
  validates :title, presence: true
end

なお、複数のバリデーションをもたせることもできます。
例えばタイトルの長さを100文字以下にしてほしい場合は次のように記述します。

¥app¥models¥test.rb
class Question < ApplicationRecord
  validates :title,
    presence: true,
    length: { maximum: 100 }
end

以下ではよく使うバリデーションを整理

空の値ではないこと

validates :title, presence: true

一意性(かぶらないようにしたいとき)

validates :title, uniqueness: true

長さ

validates :title,    length: { minimum: 10 }       # 「10文字以上」
validates :title,    length: { maximum: 100 }      # 「100文字以下」
validates :title,    length: { in: 10..100 }        # 「10文字以上100文字以下」
validates :title, length: { is: 8 }            # 「8文字のみ」

数値であること

例えばinteger型で書いてほしいとき

validates :No, numericality: true

メールアドレス形式

正規表現を駆使していて少し難しいと思うので、コピペが楽

VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
validates :email, presence: true, uniqueness: true, format: { with: VALID_EMAIL_REGEX }

これで「@が入っているか」「一意性があるか」「空ではないか」といった、メールアドレスのデータとして必要な要件を包含できているので便利です。

1
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
tmasuyama
もふもふエンジニア (個人開発) です。 Django、Ruby on Rails、CircleCI、AWS、Docker つかってます。
circleci
デベロッパーが素晴らしいプロダクトを高品質かつ迅速にデリバリーするために、CircleCIユーザーがお互いの技術や知見を交換しながら支え合い、幸せなデベロッパーライフをビルドするためのコミュニティです。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
1
Help us understand the problem. What is going on with this article?