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/
Reference
이 문제에 관하여(Rails의 다단 Association, 다단 Scope(joins)의 구현 예), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/jerrywdlee/items/e2d060e47d575dbbacd5
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
모델 구성
#### 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/
Reference
이 문제에 관하여(Rails의 다단 Association, 다단 Scope(joins)의 구현 예), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/jerrywdlee/items/e2d060e47d575dbbacd5
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
#### 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/
Reference
이 문제에 관하여(Rails의 다단 Association, 다단 Scope(joins)의 구현 예), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/jerrywdlee/items/e2d060e47d575dbbacd5
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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/
Reference
이 문제에 관하여(Rails의 다단 Association, 다단 Scope(joins)의 구현 예), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/jerrywdlee/items/e2d060e47d575dbbacd5텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)