Ruby on Rails
ActiveRecord
サーチ…
モデルを手動で作成する
Scaffoldingを使うのは、Railsを初めて使う人や新しいアプリケーションを作る人がいれば簡単ですが、足場で生成されたコードをスリム化する必要はありません。 (未使用部品を取り除くなど)。
モデルを作成するには、 app/models
下にファイルを作成するだけの簡単な方法があります。
最も簡単なモデルは、 ActiveRecord
、 ActiveRecord::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
方法を。 Tags
とProyects
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_name
とlast_name
を更新するには、次のコードを記述します。
user = User.find(1)
user.update(first_name: 'Kashif', last_name: 'Liaqat')
update
を呼び出すと、単一のトランザクション内の指定された属性を更新しようとしfalse
。成功しfalse
場合はtrue
返し、失敗した場合はfalse
返しtrue
。