前提・実現したいこと
N+1問題とアソシエーションに関してきちんと理解ができず、少し混乱気味なので、現在作成中のアプリを実例として教えていただければと思います。
会社に所属する人、会社の銀行口座といった形で下記のようなモデルを作っています。
#model CompanyーーーーUser | └ーUser | └ーUser | └ーーーBank(銀行・支店コード)ー(?)ーBankcode(銀行・支店名) └ーーーBank(銀行・支店コード)ー(?)ーBankcode(銀行・支店名)
発生している問題・エラーメッセージ
①この場合、アソシエーションの設定は下記のような形になるとの認識で良いでしょうか?
class Company < ApplicationRecord has_many :users end class User < ApplicationRecord belongs_to :company end class Bank < ApplicationRecord belongs_to :company has_one :bankcode end class Bankcode < ApplicationRecord belongs_to :bank end
②下記のような形で銀行口座名を求めたのですが、コンソールを確認するとN+1問題が発生していました。
RailsGuideのAuthorとBookだと理解できていると思うのですが、いざ自分でやろうとするとわからなくなってしまいました。
解決方法を教えていただければと思います。
#banks_controller.rb > index.html.erb <tbody> <% @banks.each do |bank| %> <tr> <td><%= Bankcode.find_by(bank: bank.bank_code).name %></td> <td><%= Bankcode.find_by(bank: bank.bank_code, branch: bank.branch_code ).name %></td> </tr> <% end %> </tbody>
#class BanksController < ApplicationController def index #deviseを利用しているためcurrent_user.idにてログイン中のUserIDを取得 @user = User.find_by(id: current_user.id) @company = Company.find(@user.company_id) @banks = Bank.where(company_id:@company.id) end
どうぞよろしくお願いいたします。
補足情報(FW/ツールのバージョンなど)
ruby 2.6.2
rails 5.2.2
追記(Bank(銀行・支店コード)ーBankcode(銀行・支店名)について)
Bank(銀行・支店コード)とBankcode(銀行・支店名)のテーブルの構造が下記のようになっています。
そのため通常のアソシエーションではうまくデータを取得できないことがわかりました。
BanksTable
1 2#会社の銀行口座の銀行コード(bank_code)、支店コード(branch_code)が記載されているテーブル 3 4ID|bank_code|branch_code|company_id|...... 51 |0001 |738 |2 |...... 62 |0001 |599 |2 |...... 73 |0005 |056 |2 |...... 8
Bankcodestable
1 2#全国銀行協会で定められたの銀行コード(bank)、支店コード(branch)が記載されているテーブル 3 4ID|bank|branch|name |...... 51 |0001|000 |みずほ銀行 |...... 610|0001|738 |たまプラーザ支店|...... 720|0001|599 |あざみ野支店 |...... 830|0005|000 |三菱UFJ銀行 |...... 930|0005|056 |あびこ支店 |...... 10
このようなテーブルの場合に下記のような結果を得るためにはどのようにすればよいでしょうか?
#banks_controller.rb > index.html.erb <tbody> <% @banks.each do |bank| %> <tr> <td>銀行名</td> <td>支店名</td> </tr> <% end %> </tbody>
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/04/04 03:18