Ruby on Rails 어소시에이션의 응용 class_name 【하나의 모델을 복수로 분기한다】
우선은 기본으로부터 복습해 갑시다! !
기본(1대다)
사용자가 여러 제품(products)을 보유하고 있는 관계라면,
user.rb
class User < ApplicationRecord
has_many :products
end
products는 user에 보관되어 있기 때문에,
product.rb
class Product < ApplicationRecord
belongs_to :user
end
user라고 하는 폴더에, 복수의 product 파일이 있는 감각과 같다.
그래서 user는 단수형, product는 복수형
product가 상위 폴더의 user에 들어 있기 때문에 belongs_to :user
user 폴더에는 많은 제품이 있으므로 has_many :products
응용(일대다): class_name
그럼, products를 보관 유지하는 user가, 판매자(seller)·구매자(buyer)로 나누는 경우는 어떻게 합니까?
셀러 및 구매자는 각각 모델이 필요하지 않습니다. user 모델을 나누어 주면 괜찮습니다. 그렇지 않으면 ID가 바뀌고 반대로 힘들기 때문에.
user는 products를 복수 보유하고 있으므로 동일합니다.
(다음에 합니다.)
user.rb
class User < ApplicationRecord
has_many :products
end
products에 묶는 user를 "seller"와 "buyer"로 나누고 싶으므로 아래와 같이 합니다.
product.rb
class Product < ApplicationRecord
belongs_to :seller, class_name: "User", foreign_key: "seller_id"
belongs_to :buyer, class_name: "User", foreign_key: "buyer_id"
end
「뭐야!」라고 되었다고 생각합니다. 요점을 억제하면 간단합니다.
그럼 해설해 갑니다.
STEP1 모델명은 바뀐다.
기초라고 아래와 같이, Product는 User에 연결하고 있었습니다.
product.rb
class Product < ApplicationRecord
belongs_to :user
end
belongs_to :user라고 기술되어 있지만, 이 "user"라는 이름을 바꿀 수 있습니다.
「user가 아니고, owner로 바꾸고 싶어??」
이렇게 이름을 바꾸고 싶다면 class_name을 사용합니다.
product.rb
class Product < ApplicationRecord
belongs_to :owner, class_name: "user" # belongs_to :userと同じです。
# 元はUserモデルだけど(class_name: "user")、ownerって表示に変えますわ(belongs_to :owner)
end
STEP2: User 모델 분리
하나라면 STEP1만으로 바꿀 수 있습니다 (뭐, 바꿀 필요 없지만).
그럼 user를 seller와 buyer와 2개로 나누고 싶다면 어떻게 하면 좋을까요?
먼저 products 테이블을 살펴보십시오.
product 레코드의 열에 "buyer_id(user_id)"와 "seller_id(user_id)"가 있습니다.
이 컬럼에 넣는 id를 바탕으로 user를 seller와 buyer로 나누고 있습니다.
product.rb
class Product < ApplicationRecord
belongs_to :seller, class_name: "user", foreign_key: "seller_id"
# belongs_to :seller, class_name: "user" = (Productに紐づく) Userモデルをsellerと定義するわ。
# foreign_key: "seller_id" = user_idはProductレコードの『seller_idカラム』のid番号を使うわ
belongs_to :buyer, class_name: "user", foreign_key: "buyer_id"
# belongs_to :buyer, class_name: "user" = (Productに紐づく) Userモデルをbuyerと定義するわ。
# foreign_key: "seller_id" = user_idはProductレコードの『buyer_idカラム』のid番号を使うわ
end
이것으로 두 가지로 나뉘어졌습니다.
칼럼에 묶는 id 번호로 나눈 것입니다.
STEP3: Product를 복수로 나누기
판매 중, 판매, 구입한 상품으로 나눕니다.
판매중에만 습득
판매한 만큼 얻기
구입한 상품만 취득
user.rb
class User < ApplicationRecord
# 全部取得
has_many :products
# 販売中
has_many :selling_products, class_name: "product", foreign_key: "seller_id", -> { where("buyer_id is NULL") }
# Productモデル名を selling_productsに定義するわ = has_many :selling_products, class_name: "product"
# productレコードの”seller_id”カラムに自分のidが入っている、productだけ取得するね = foreign_key: "seller_id" ( userはhas_many: productsだから )
# でも、buyer_idが入っていないproductだけにする = -> { where("buyer_id is NULL") }
# 買った商品
has_many :bought_products, class_name: "product", foreign_key: "buyer_id"
# Productモデル名を bought_productsに定義するわ = has_many :bought_products, class_name: "product"
# productレコードの”buyer_id”カラムに自分のidが入っている、productだけ取得するね = foreign_key: "buyer_id" ( userはhas_many: productsだから )
# 売却済み商品
has_many :sold_products, class_name: "product", foreign_key: "seller_id", -> { where("buyer_id is not NULL") }
# Productモデル名を sold_productsに定義するわ = has_many :selling_products, class_name: "product"
# productレコードの”seller_id”カラムに自分のidが入っている、productだけ取得するね = foreign_key: "seller_id" ( userはhas_many: productsだから )
# でも、buyer_idが入ってるproductだけにする = -> { where("buyer_id is not NULL") }
end
요약
class_name으로 모델을 나눌 때,
요약
has_many :〜側のモデルのカラムを使って分ける。
# 今回だと
has_many :products
# productにuser_idを紐づけるので、これを使って分ける。
# 親元のuserのカラムにproduct_idは入れないので、userのカラムを使って分けることはできない。
まとめ: 1対多なら、 『多』のカラムを使って分けよう ( foreign_key: )
에러 포인트
오류
uninitialized constant
가 표시되면 class_name이 소문자입니다.
오류
class_name: "product" = 大文字 = エラーなし
class_name: "product" = 小文字 = エラー:uninitialized constant
참고 링크
【초보자용】 너무 정중한 Rails 『연결』 튜토리얼 【어떻게 뭐든지】
rails 연관 옵션 노트
협회에서 class_name의 정의!
Reference
이 문제에 관하여(Ruby on Rails 어소시에이션의 응용 class_name 【하나의 모델을 복수로 분기한다】), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/gyu_outputs/items/421cc1cd2eb5b39e20ad텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)