中間テーブルを介したhas_manyな関係にあるテーブルに、該当するレコードが存在するかを確認したい
作ったコードがスマートではないため、もっと良いコードがあれば教えてください。
前提条件
model
1class Account < ApplicationRecord 2 has_many :group_accounts 3end 4 5class GroupAccount < ApplicationRecord 6 belongs_to :group 7 belongs_to :account 8end 9 10class Group < ApplicationRecord 11has_many :group_accounts 12end
table
1class CreateGroups < ActiveRecord::Migration[5.1] 2 def change 3 create_table :groups do |t| 4 t.string :team_name 5 t.timestamps 6 end 7 end 8end 9 10class CreateGroupAccounts < ActiveRecord::Migration[5.1] 11 def change 12 create_table :group_accounts do |t| 13 t.integer :group_id 14 t.integer :account_id 15 t.string :join_switch 16 t.timestamps 17 end 18 end 19end 20 21class CreateAccounts < ActiveRecord::Migration[5.1] 22 def change 23 create_table :users do |t| 24 t.string :name 25 t.timestamps 26 end 27 end 28end
作ったコード
Ruby
1<% @switch_true=[] %> 2 3<% Groups.each do |group| %> 4 <% @pickup_group_accounts = group.group_accounts.where('account_id = ?', current_account.id).where('join_switch = ?', "true") %> 5 <% if @pickup_group_accounts.present? %> 6 <% @switch_true.push @pickup_group_accounts %> 7 <% end %> 8<% end %> 9 10<% if @switch_true.present? %> 11 参加者あり 12<% else %> 13 参加者なし 14<% end %>
ご説明と解決方法の検討(自己検討)
Groupテーブルからレコードを順番に取り出し、Groupに紐づいた中間テーブル(group_accounts)で検索条件を指定し、さらにAccountsテーブルで検索条件を指定した上で、該当レコードを抽出しています。
テーブル同士がhas_manyな関係にあるため、eachメソッドのループ内で
Ruby
1<% Groups.each do |group| %> 2 <% @pickup_group_accounts = group.group_accounts.where('account_id = ?', current_account.id).where('join_switch = ?', "true") %> 3 <% if @pickup_group_accounts.present? %> 4 参加者あり 5 <% else %> 6 参加者なし 7 <% end %> 8<% end %>
というやり方をすると、重複した結果(参加者あり)が複数取り出されてしまいましたので、上記の方法で判別していますが、力技っぽくていまいちな印象を持っています。
なんとなくjoinメソッドを使えば上手く取り出せそうな感じがしましたが、どうすれば良いか思いつかず、詰まってしまいました。
どなたかご教授いただけませんでしょうか?
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/10/11 10:31