piyo_id
をそれぞれリレーションに持つ
Hoge
Fuga
というクラスがあります。
whereで取得したアクティブレコードをそれぞれ繰り返したいです。
hoges = Hoge.where(piyo_id: 1) fugas = Fuga.where(piyo_id: 1)
そもそもやりたいこととしては
hoges = Hoge.where(piyo_id: 1) hoges.each do |hoge| fuga = Fuga.find_by(fuga_name: hoge.name) ~~~処理~~~ end
上記のように
取得した hoges
をもとに hoge
というブロック変数を使って
fuga
のデータを取得していたのですが
SQLがその都度発行されて N+1
となるので、
whereを使用して、1回で発行しようと考えた次第です。
hoges = Hoge.where(piyo_id: 1) fugas = Fuga.where(piyo_id: 1) hoges.each do |hoge| ~~~hogeを使った処理を1回実行~~~ fugas.each do |fuga| ~~~fugaを使った処理を1回実行~~~ end end
のような処理をしたいです。
ブロックのなかの情報をもとに、別の繰り返し処理をするやり方をご教示頂きたいです。
> ですが、この順番だとうまくいきません。
うまくいかないとはどういうことですか?
全体的に間違えてしまったので修正しました
> ブロックのなかの情報をもとに、別の繰り返し処理をするやり方をご教示頂きたいです。
結局何がしたいのでしょうか?
「hogeを使った処理」「fugaを使った処理」を具体的に記載してください。
それが記載されないことにはどうすれば良いのかわかりません。
そして現状では何がだめなのかを教えて下さい。
piyo、hoge,fuga の関係が不明確です。モデルの関連を定義している所を見せて下さい。
とくに、hogeとfugaが1:1なのか?
というのは
「そもそもやりたいこととしては 」で書かれているのは hoge一つにfuga一つの処理ですが「whereを使用して、1回で発行しようと考えた次第です。 」の次に書かれているのはhoge一つ毎にfugaを全部繰り返しています。
hogeひとつにfuga一つ処理をしたいのなら、hogeとfugaの関係がわからないとコメントできないので
winterboum 様
Piyo.rb
has_many :hoge, dependent: :destroy
has_many :fuga, dependent: :destroy
Hoge.rb
belongs_to :piyo
Fuga.rb
belongs_to :piyo
ですね
>hogeひとつにfuga一つ処理をしたい
処理としてはそうしたいです
hoge一つ選んだ時、どのfugaを選んだら良いのでしょう
fugaの fuga_nameという属性が、hoge.nameと一致するものを選びたいです。
返答がおかしかったら申し訳ないです。
回答2件
あなたの回答
tips
プレビュー