Поиск…


Создание модели вручную

В то время как использование строительных лесов является быстрым и легким, если вы новичок в 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 если нет.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow