LoginSignup
3
3

More than 3 years have passed since last update.

Railsの多段Association、多段Scope(joins)の実装例

Last updated at Posted at 2019-04-03

はじめに

本記事はRails5.2にて作成されています、他のバージョンでの互換性を保証しません。

Table構成

dbdiagram_io_-_Database_Relationship_Diagrams_Design_Tool.png

Model構成

#### 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を二段has_manyしたい & themeからorderを二段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)

itemreview.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が有効であることもわかりました。

参考

https://blog.toshimaru.net/belongs_to-through/
https://qiita.com/takashisite/items/9d1484b88708e2872134
https://qiita.com/ishidamakot/items/7dba557d764362a828ff
https://qiita.com/rorensu2236/items/6a97e829f4e5940e8d7e
https://blog.toshimaru.net/belongs_to-through/

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3