サーチ…


モデルを手動で作成する

Scaffoldingを使うのは、Railsを初めて使う人や新しいアプリケーションを作る人がいれば簡単ですが、足場で生成されたコードをスリム化する必要はありません。 (未使用部品を取り除くなど)。

モデルを作成するには、 app/models下にファイルを作成するだけの簡単な方法があります。

最も簡単なモデルは、 ActiveRecordActiveRecord::Baseを拡張したクラスです。

class User < ActiveRecord::Base
end

モデルファイルはapp/models/格納され、ファイル名はクラスの単数名に対応します。

# user
app/models/user.rb

# SomeModel
app/models/some_model.rb

クラスは、ActiveRecordのすべての機能(クエリメソッド、検証、コールバックなど)を継承します。

# Searches the User with ID 1
User.find(1)

注:対応するモデルの表が存在することを確認してください。そうでない場合は、 移行を作成してテーブルを作成できます

モデルを生成することができ、それは次のコマンドからのターミナルによる移行です

rails g model column_name1:data_type1, column_name2:data_type2, ...

次のコマンドで外部キー(関係)をモデルに割り当てることもできます

rails g model column_name:data_type, model_name:references

発電機によるモデルの作成

Ruby on Railsは、ActiveRecordモデルの作成に使用できるmodelジェネレータを提供します。 rails generate modelを使用してモデル名を指定するだけです。

$ rails g model user

app/modelsモデルファイルに加えて、ジェネレータは以下を作成します:

  • test/models/user_test.rb
  • test/fixtures/users.yml
  • db/migrate/XXX_create_users.rbのデータベースの移行

また、モデルを生成するときに、モデルのいくつかのフィールドを生成することもできます。

$ rails g model user email:string sign_in_count:integer birthday:date

これにより、適切なタイプのデータベースにemail、sign_in_count、birthdayという列が作成されます。

移行を作成する

既存のテーブルのフィールドの追加/削除

次のコマンドを実行して移行を作成します。

rails generate migration AddTitleToCategories title:string

これにより、 categoriesテーブルにtitle列を追加する移行が作成categoriesます。

class AddTitleToCategories < ActiveRecord::Migration[5.0]
  def change
    add_column :categories, :title, :string
  end
end

同様に、マイグレーションを生成して列を削除することもできますrails generate migration RemoveTitleFromCategories title:string

categoriesテーブルからtitle列を削除する移行が作成categoriesます。

class RemoveTitleFromCategories < ActiveRecord::Migration[5.0]
  def change
    remove_column :categories, :title, :string
  end
end

厳密に言えば、 型の指定(この場合は:string )は列を削除するために必要ではありませんが、 ロールバックに必要な情報が提供されるので便利です。

テーブルを作成する

次のコマンドを実行して移行を作成します。

rails g CreateUsers name bio

RailsはCreate接頭辞から表を作成する意図を認識し、残りの移行名は表名として使用されます。与えられた例は、以下を生成する:

class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
      t.string :name
      t.string :bio
    end
  end
end

作成コマンドで列の型が指定されておらず、既定のstringが使用されています。

結合表を作成する

次のコマンドを実行して移行を作成します。

rails g CreateJoinTableParticipation user:references group:references

Railsは、移行名でJoinTableを見つけることによって結合テーブルを作成する意図を検出します。他のすべては、あなたが名前の後に与えるフィールドの名前から決定されます。

class CreateJoinTableParticipation < ActiveRecord::Migration
  def change
    create_join_table :users, :groups do |t|
      # t.index [:user_id, :group_id]
      # t.index [:group_id, :user_id]
    end
  end
end

必要なindexステートメントのコメントを外し、残りのステートメントを削除します。

優先順位

サンプルの移行名CreateJoinTableParticipationがテーブル作成のルールと一致していることに注目してください。このテーブルにはCreateプレフィックスがありCreate 。しかし、それは単純なcreate_table生成しませんでした。これは、移行ジェネレータ( ソースコード )が次のリストの最初の一致を使用するためです。

  • (Add|Remove)<ignored>(To|From)<table_name>

  • <ignored>JoinTable<ignored>

  • Create<table_name>

コールバックの概要

コールバックは、オブジェクトのライフサイクルの特定の時点(データベースの作成、削除、更新、検証、保存、またはデータベースからのロードの直前または直後)に呼び出されるメソッドです。

たとえば、作成日から30日以内に有効期限が切れるリストがあるとします。

これを行う1つの方法は次のようなものです:

class Listing < ApplicationRecord
  after_create :set_expiry_date

  private

  def set_expiry_date
    expiry_date = Date.today + 30.days
    self.update_column(:expires_on, expiry_date)
  end
end

コールバックの利用可能なメソッドはすべて、各オブジェクトの操作中に呼び出されるのと同じ順序で、次のとおりです。

オブジェクトの作成

  • before_validation
  • after_validation
  • before_save
  • around_save
  • before_create
  • around_create
  • after_create
  • after_save
  • after_commit / after_rollback

オブジェクトの更新

  • before_validation
  • after_validation
  • before_save
  • around_save
  • before_update
  • around_update
  • after_update
  • after_save
  • after_commit / after_rollback

オブジェクトを破棄する

  • before_destroy
  • around_destroy
  • after_destroy
  • after_commit / after_rollback

注記: after_saveは、作成と更新の両方で実行されますが、マクロ呼び出しが実行された順序にかかわらず、常により特定のコールバックafter_createとafter_updateの後に実行されます。

移行を使用して結合表を作成する

以下のために特別に有用has_and_belongs_to_many関係は、手動で使用して結合テーブルを作成することができcreate_table方法を。 TagsProyects 2つのモデルがあり、 has_and_belongs_to_many関係を使ってそれらをhas_and_belongs_to_manyとします。両方のクラスのインスタンスを関連付けるには、結合テーブルが必要です。

class CreateProjectsTagsJoinTableMigration < ActiveRecord::Migration
  def change
    create_table :projects_tags, id: false do |t|
      t.integer :project_id
      t.integer :tag_id
    end
  end
end

表の実際の名前は、この規則に従う必要があります。アルファベット順に先行するモデルを先に実行する必要があります。 P rojectはT agsに先行するので、テーブルの名前はprojects_tagsです。

また、この表の目的は、2つのモデルのインスタンス間の関連付けをルーティングすることであるため、この表の各レコードの実際のIDは必要ありません。これを指定するには、 id: falseを渡しid: false

最後に、Railsの習慣のように、テーブル名は複合モデルの個々のモデルの複合型でなければならないが、テーブルの列は単数形でなければならない。

モデルの手動テスト

アクティブレコードモデルをコマンドラインインターフェイスでテストするのは簡単です。端末のappディレクトリに移動し、 rails consoleを入力してRailsコンソールを起動します。ここから、アクティブなレコードメソッドをデータベース上で実行できます。

たとえば、 name:stringカラムとemail:stringを持つUsersテーブルを持つデータベーススキーマがある場合は、次のコマンドを実行できます。

User.create name: "John", email: "[email protected]"

そのレコードを表示するには、次のコマンドを実行します。

User.find_by email: "[email protected]"

あるいは、これがあなたの最初のレコードであれば、次のコマンドを実行するだけで最初のレコードを取得できます:

User.first

モデルインスタンスを使用して行を更新する

Userモデルがあるとします

class User < ActiveRecord::Base
end

id = 1ユーザーのfirst_namelast_nameを更新するには、次のコードを記述します。

user = User.find(1)
user.update(first_name: 'Kashif', last_name: 'Liaqat')

updateを呼び出すと、単一のトランザクション内の指定された属性を更新しようとしfalse 。成功しfalse場合はtrue返し、失敗した場合はfalse返しtrue



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow