0
Help us understand the problem. What are the problem?

posted at

fileterメソッドを使用してN+1問題を解決した

次の状況でN+1問題が発生しておりました。その解決方法になります。

model/model1.rb
class:Model1
 has_many :model3s,
 has_many :model2s, through: :model3s
model/model2.rb
class:Model2
 has_many :model3s,
 has_many :model1s, through: :model3s
model/model3.rb
class:Model3(Modle1Modle2の中間テーブル)
 belongs :model1
 belongs :model2
controllers/sample_controller.rb
 @model1 = Model1.eager_load(:model3s)
views/sample.html.erb
 # model2_idはループで回される値
   @model1.where(model3s: { [model2_id]: model2_id })

このままだとループの度にSQLが発行されてしまいます。

今回は次のように解決しました。

views/sample.html.erb
 # model2_idはループで回される値
   @model1.filter { |model1| model2_id.in?(model1.model3s.pluck(:model2_id))

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
0
Help us understand the problem. What are the problem?