はじめに
忘れてしまいがちなので備忘録。
条件
Project
モデルに、has_manyでParticipation
モデルが関連付けされている。
createされたproject
にuserが参加アクションをすると、participation
が該当のprojectにぶら下がる形でcreateされる。
なので、Projectのインスタンスであるprojectがparticipationを持っていない( @project.participations => []
)ということがありえる。
project.rb
class Project < ApplicationRecord
has_many :participations
・
・
・
viewでparticipationを持っているprojectだけを表示したい。
やり方として一番簡単そうなのは、例えばcontrollerで
@projects = Project.where(user: current_user)
みたいな感じにして、viewテンプレートで
show.html.erb
<%= @projects.each do |project| %>
<% if project.participations.present? %>
<% project.name %>
<% end %>
<% end %>
↑と書いてしまえばよいが、if文で毎回チェックさせるのもイマイチなので、
controllerで@project
を格納するタイミングでparticipation
がないものを除外させたい。
participationを持っているprojectだけを格納したい
答えを先に書くと、includes
とwhere
を駆使して、
.includes(:participations).where(participations: Participation.all)
みたいな書き方をすればよい。
↓例:
participations_controller.rb
class ParticipationsController < ApplicationController
def show
@participation = Participation.find(params[:id])
@participations = Participation.search_by_client(current_client)
@projects = Project.where(client: current_client).where.not(status: "finished").
includes(:participations).where(participations: @participations)
end
show.html.erb
<%= @projects.each do |project| %>
<% project.name %>
<% end %>