Rails의 다단 Association, 다단 Scope(joins)의 구현 예

5646 단어 SQLRailsActiveRecord

소개



이 기사는 Rails5.2에서 작성되었으며 다른 버전과의 호환성을 보장하지 않습니다.

표 구성





모델 구성


#### item.rb ####
class Item < ActiveRecord::Base
  belongs_to :order
end

#### order.rb ####
class Order < ActiveRecord::Base
  has_many :items
  has_many :reviews
end

#### review.rb ####
class Review < ActiveRecord::Base
  belongs_to :order
  has_many :themes
end

#### theme.rb ####
class Theme < ActiveRecord::Base
  belongs_to :review
end

다양한 구현



다단Association



order에서 theme을 2단 has_many 하고 싶다 & theme에서 order를 2단 belongs_to 하고 싶다


#### order.rb ####
class Order < ActiveRecord::Base
  # ...
  has_many :themes, through: :reviews
end

#### theme.rb ####
class Theme < ActiveRecord::Base
  # ...
  delegate :order, to: :reviews
end

주의: has_many, through 반대는 delegate, to
이러한 SQL이 발행됩니다.
pry(main)> Theme.last.order
  Theme Load (0.4ms)  SELECT  `reviews`.* FROM `reviews` ORDER BY `reviews`.`id` DESC LIMIT 1
  Review Load (0.3ms)  SELECT  `reviews`.* FROM `reviews` WHERE `reviews`.`id` = 1 LIMIT 1
  Order Load (0.5ms)  SELECT  `orders`.* FROM `orders` INNER JOIN `reviews` ON `reviews`.`id` = `orders`.`review_id` WHERE `orders`.`review_id` = 1 LIMIT 1

다단 Scope(다단 Joins)



item을 review.text로 sort하고 싶습니다.


#### item.rb ####
class Item < ActiveRecord::Base
  # ...
  scope :join_reviews, -> { joins(:order, order: :reviews) }
end

이러한 SQL이 발행됩니다.
pry(main)> Item.all.order("review.theme_id desc")
  Item Load (7.0ms)  SELECT  `items`.* FROM `items` INNER JOIN `orders` ON `orders`.`id` = `items`.`order_id` INNER JOIN `reviews` ON `reviews`.`order_id` = `orders`.`id` ORDER BY reviews.text DESC

delegate 위험설(2019-09-15갱신)



이 기사이 쓴 것처럼, delegate 문장을 사용하면, Ransack이 불발이 되어 버리는 사건은, 필자도 확인할 수 있었으므로. 다단 belongs_to 를 짤 때 이 기사 이 쓴 것처럼 has_one through 가 유효하다는 것을 알았습니다.

참고



htps : // bg. 하고 버린다. 네 t/베안 gs_와 th 로우 gh/
htps : // 이 m / 타카시 / ms / 9d1484b88708에 2872134
htps : // 코 m / 이시다 마코 t /
htps : // 코 m / 로렌스 2236 / MS / 6 A97 829f4 5940 8d7 에
htps : // bg. 하고 버린다. 네 t/베안 gs_와 th 로우 gh/

좋은 웹페이지 즐겨찾기