Ruby on Rails 어소시에이션의 응용 class_name 【하나의 모델을 복수로 분기한다】

10286 단어 루비RailsRails5
잊고 있을지도 모르기 때문에,
우선은 기본으로부터 복습해 갑시다! !

기본(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의 정의!

좋은 웹페이지 즐겨찾기