Ruby on 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
이 경우 :string
) 열을 제거하는 데 반드시 필요한 것은 아니며 , 롤백에 필요한 정보를 제공하므로 유용 합니다.
표 만들기
다음을 실행하여 마이그레이션을 만듭니다.
rails g CreateUsers name bio
레일즈는 Create
접두어로 테이블을 생성하려는 의도를 인식하고 나머지 이주 이름은 테이블 이름으로 사용됩니다. 주어진 예제는 다음을 생성합니다 :
class CreateUsers < ActiveRecord::Migration
def change
create_table :users do |t|
t.string :name
t.string :bio
end
end
end
creation 명령이 열 유형을 지정하지 않았으며 기본 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_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
관계를 사용하여 연관 Proyects
한다고 가정 해보십시오. 두 클래스의 인스턴스를 연결하려면 조인 테이블이 필요합니다.
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입니다.
또한이 표의 목적은 두 모델의 인스턴스 간 연관을 라우트하는 것이므로이 표의 모든 레코드의 실제 ID는 필요하지 않습니다. id: false
를 전달하여 지정합니다 id: false
마지막으로, Rails의 관습과 같이 테이블 이름은 개별 모델의 복합 복수 형식이어야하지만 테이블의 열은 단일 형식이어야합니다.
모델 수동 테스트
명령 행 인터페이스를 통해 Active Record 모델을 테스트하는 것은 간단합니다. 터미널의 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
를 호출하면 (자), 단일의 트랜잭션 (transaction)로 지정된 속성을 갱신하려고합니다. 성공했을 경우는 true
, 실패했을 경우는 false
돌려줍니다.