Ruby on Rails
ActiveRecord
Поиск…
Создание модели вручную
В то время как использование строительных лесов является быстрым и легким, если вы новичок в 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 предоставляет генератор model
который можно использовать для создания моделей ActiveRecord. Просто используйте 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 и день рождения в вашей базе данных с соответствующими типами.
Создание миграции
Добавить / удалить поля в существующих таблицах
Создайте миграцию, выполнив:
rails generate migration AddTitleToCategories title:string
Это создаст миграцию, которая добавит столбец title
в таблицу categories
:
class AddTitleToCategories < ActiveRecord::Migration[5.0]
def change
add_column :categories, :title, :string
end
end
Аналогично, вы можете создать миграцию, чтобы удалить столбец: rails generate migration RemoveTitleFromCategories title:string
Это создаст миграцию, которая удалит столбец 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
имя миграции CreateJoinTableParticipation
соответствует правилу для создания таблицы: оно имеет префикс Create
. Но он не создал простую create_table
. Это связано с тем, что генератор миграции ( исходный код ) использует первое совпадение следующего списка:
(Add|Remove)<ignored>(To|From)<table_name>
<ignored>JoinTable<ignored>
Create<table_name>
Введение в обратные вызовы
Обратный вызов - это метод, который вызывается в определенные моменты жизненного цикла объекта (прямо до или после создания, удаления, обновления, проверки, сохранения или загрузки из базы данных).
Например, скажем, у вас есть листинг, срок действия которого истекает через 30 дней со дня создания.
Один из способов сделать это:
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
, и вы хотите связать их с помощью отношения 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, поэтому имя таблицы - project_tags.
Кроме того, поскольку целью этой таблицы является маршрутизация связи между экземплярами двух моделей, фактический идентификатор каждой записи в этой таблице не требуется. Вы указываете это, передавая id: false
Наконец, как и соглашение в Rails, имя таблицы должно быть составной множественной формой отдельных моделей, но столбец таблицы должен быть в единственном числе.
Ручное тестирование моделей
Тестирование моделей Active Record через интерфейс командной строки прост. Перейдите в каталог приложения в своем терминале и введите rails console
чтобы запустить консоль Rails. Отсюда вы можете запускать активные методы записи в своей базе данных.
Например, если у вас была схема базы данных с таблицей Users, имеющей name:string
column и email:string
, вы можете запустить:
User.create name: "John", email: "[email protected]"
Затем, чтобы показать эту запись, вы можете запустить:
User.find_by email: "[email protected]"
Или, если это ваша первая или единственная запись, вы можете просто получить первую запись, запустив ее:
User.first
Использование экземпляра модели для обновления строки
Допустим, у вас есть модель User
class User < ActiveRecord::Base
end
Теперь, чтобы обновить first_name
и last_name
пользователя с id = 1
, вы можете написать следующий код.
user = User.find(1)
user.update(first_name: 'Kashif', last_name: 'Liaqat')
Вызов update
попытается обновить данные атрибуты в одной транзакции, возвращая true
если успешно, и false
если нет.