[Rails] 다중 모형의 설치, 컨트롤러, 보기 쓰기
개시하다
Rails를 통해 여러 쌍의 모형을 제작하여 컨트롤러 보기를 실현하였다.과거에도 해 봤기 때문에 할 수 있을지 없을지 고민했지만 망설여서 일단 절차를 적어뒀다.
데이터베이스 디자인
이번 테이블은 이런 느낌이에요.작품(works)에는 여러 종류(categories)가 있고, 각자의 분류에도 여러 작품이 있다.
워크시트
column
type
id
integer
name
string
description
string
...
...
categories 탁자
column
type
id
integer
name
string
work categories 테이블 (중간 테이블)
column
type
id
integer
category_id
integer
work_id
integer
하지만 현재 가운데 테이블에는 명명 규칙(※)이 없는 것 같습니다.두 표의 이름을 연결해서 명명하는 경우 자모순으로 명명하는 것이 습관인 것 같다.
몰라요work_category
책상이라는 이름을 썼어요. 다음 기술도 직접 쓰게 해주세요...
※ 사용has_and_belongs_to_many
시 명명 규칙이 있는 것 같습니다.현재 규칙은 가능한 한 의미 있는 책상 이름을 사용하는 것이다.
migration 파일의 기술
중간표의migration 파일을 만들 때 포인트가 좀 있어요.$ rails g model work_category
디렉토리 파일def change
create_table :work_categories do |t|
t.references :work, index: true
t.references :category, index: true, foreign_key: true
t.timestamps
end
end
이 기술에서workid와 category각각 id 표시줄을 생성합니다.항목에 index: true
옵션을 추가하여 검색을 고속화합니다.foreign_key: true
category 테이블에 없는 분류가 추가되지 않도록 옵션을 추가합니다.
그러나 foreign_key: true
까지 더하면 관계에 의존하는 다른 표의 열을 자유롭게 편집할 수 없기 때문에 이번 연습용 앱처럼 고민하면서 만들면 마지막으로 외부 키의 제한을 더해도 된다.
▶ 참조 링크
외부 키 사용의 개요와 제약의 장점과 단점
모델에 추가 연결
work, category, work_category의 모델에 다음과 같은 관련을 보충한다.
단수형식, 복수형식의 주의가 필요하여 Rails 자습서의 다대다 관계의 항목을 참조하였다.
models/category.rbclass Category < ApplicationRecord
has_many :work_categories #1
has_many :works, through: :work_categories #2
end
#1
와#2
이 순서대로 쓰지 않으면 오류가 발생할 수 있습니다.아래와 같다.
models/work.rbclass Work < ApplicationRecord
has_many :work_categories, dependent: :destroy
has_many :categories, through: :work_categories
accepts_nested_attributes_for :work_categories, allow_destroy: true
end
models/work_category.rbclass WorkCategory < ApplicationRecord
belongs_to :work
belongs_to :category
end
dependent: :destroy
는 의존 관계의 데이터를 삭제하는 옵션입니다. 만약에 어떤 작업이 삭제되면 이와 관련된work입니다.categories 테이블의 데이터도 삭제되었습니다.accepts_nested_attributes_for
는 관련 항목을 포함하여 한꺼번에 업데이트, 삭제할 때의 설정 항목이다.
있으면 필요없겠지??그렇게 생각하지만 분류 내용이 변경될 때 이게 있으면 편리할까요??검증이 필요한 부분입니다.(추후 추기 가능)
그리고 이 방면에 관해서 이쪽의 보도는 나에게 매우 도움이 된다.
▶ 인용 기사
rails를 사용하여 다중 관계를 실현할 때의 요점 (수정 가능)
controller 작업params 편집
controllers/works_controller.rbdef work_params
params.require(:work).permit(:name, :description, { category_ids: [] })
end
Work를 작성(new)·편집(edit·update)할 때, workcategories 테이블에 데이터를 넣기 위해strongparameterdependent: :destroy
에서 작업categories의 그룹을 입력할 수 있습니다.
view에서 분류를 일람하고 표시하고 편집합니다
works_controller의 new와edit에서 category를 복선상자로 표시하고 선택하면 분류된 값을 설정하고 편집할 수 있습니다.
▶ 하고 싶은 건 이런 느낌
▶ 작성된 코드는 다음과 같다.
controllers/works_controller.rb= collection_check_boxes(:work, :category_ids, Category.all, :id, :name ) do |t|
=t.label { t.check_box + t.text }
이 코드의 뜻은 이전에 쓴 보도가 있기 때문에 졸저를 참조하세요.
[초보자를 향해] 칸을 다양하게 써요.
그러면 상기 다중 관계를 가진 모델, 컨트롤러, 보기의 실현이 대체적으로 완성되었다.일단 시작하면 여러 가지 디테일을 주의해야 하기 때문에 다른 테이블과 관계를 맺을 때 참고하고 싶습니다.
끝까지 읽어주셔서 감사합니다.
Reference
이 문제에 관하여([Rails] 다중 모형의 설치, 컨트롤러, 보기 쓰기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/tanutanu/items/1607627d475072701247
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
$ rails g model work_category
def change
create_table :work_categories do |t|
t.references :work, index: true
t.references :category, index: true, foreign_key: true
t.timestamps
end
end
class Category < ApplicationRecord
has_many :work_categories #1
has_many :works, through: :work_categories #2
end
class Work < ApplicationRecord
has_many :work_categories, dependent: :destroy
has_many :categories, through: :work_categories
accepts_nested_attributes_for :work_categories, allow_destroy: true
end
class WorkCategory < ApplicationRecord
belongs_to :work
belongs_to :category
end
def work_params
params.require(:work).permit(:name, :description, { category_ids: [] })
end
= collection_check_boxes(:work, :category_ids, Category.all, :id, :name ) do |t|
=t.label { t.check_box + t.text }
Reference
이 문제에 관하여([Rails] 다중 모형의 설치, 컨트롤러, 보기 쓰기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/tanutanu/items/1607627d475072701247텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)