●状況
DBに大量にデータのあるテーブルA、テーブルB、テーブルCが存在する
①テーブルBはテーブルAのカラム1と一致するデータを検索
②テーブルCは、上記で絞り込んだテーブルBのカラム2と一致するデータを検索
テーブルA.each do |sample|
hoge = テーブルB.where(カラム1: sample.カラム1)
hoge2 = テーブルC.where(カラム2: hoge.カラム2)
〜省略〜
end
上記を実行すると、「underfind method カラム2 for 〜」とエラーが発生する。
●解決策
テーブルCが複数のデータが必要な場合、
一度hogeの時点でカラム2の配列情報にして渡す必要がある。
現状の内容は、
hogeの内容を見ると下記のように「ActiveRecord::Relation」型となっている。
#=><ActiveRecord::Relation [
#<User id: nil, カラム1: "aaa", カラム2: 111>,
#<User id: nil, カラム1: "bbb", カラム2: 222>,
#<User id: nil, カラム1: "ccc", カラム2: 333>
#], >
これを配列にして渡すことで、テーブルCも必要な絞り込みが出来るようになる。
そのため、下記のように記載するとエラーが出ずに渡せる。
テーブルA.each do |sample|
hoge = テーブルB.where(カラム1: sample.カラム1).pluck(:カラム2)
hoge2 = テーブルC.where(カラム2: hoge.カラム2)
〜省略〜
end
参考記事:
【Rails】カラムの値を配列の形で取得したい場合に使えるpluckメソッドを徹底解説
https://coffee-engineer4.com/2021/06/12/%E3%80%90rails%E3%80%91%E3%82%AB%E3%83%A9%E3%83%A0%E3%81%AE%E5%80%A4%E3%82%92%E9%85%8D%E5%88%97%E3%81%AE%E5%BD%A2%E3%81%A7%E5%8F%96%E5%BE%97%E3%81%97%E3%81%9F%E3%81%84%E5%A0%B4%E5%90%88%E3%81%AB/