#ruby-on-rails
#ruby-on-rails
Вопрос:
Я использую Rails 6.0.3.4 и не могу найти «NoMethodError в Ga::Districts#index»:
неопределенный метод `cases’ — вы имели в виду? класс корпуса
В этой строке:
<% @district.cases.each do |case_data| %>
Вот мои файлы:
Модель района
class District < ApplicationRecord
has_many :users
has_many :cases
belongs_to :state
end
Модель корпуса
class Case < ApplicationRecord
belongs_to :user
belongs_to :diagnosis
belongs_to :district
scope :unconfirmed, -> { where(confirmed_at: nil) }
scope :confirmed, -> { where.not(confirmed_at: nil) }
end
Районный контролер (/controllers/ga)
class Ga::DistrictsController < ApplicationController
before_action :authenticate_user!
before_action :current_user_ga?
def current_user_ga?
return if current_user.role == 'ga'
redirect_to root_path
end
def index
@district = District.includes(:cases).where(id: 1)
#I don't want to use a static ID, instead it should be the district_id of the current user.
end
end
и index.html.erb (views/ga / districts)
<h1>Total cases for</h1>
<table class="table table-striped">
<thead>
<tr>
<th scope="col">Gender</th>
<th scope="col">Birthdate</th>
<th scope="col">Place of residence</th>
<th scope="col">Diagnosis</th>
<th scope="col">Confirmed at</th>
</tr>
</thead>
<tbody>
<% @district.cases.each do |case_data| %>
<tr>
<td><%= case_data.gender %></td>
<td><%= case_data.birthdate %></td>
<td><%= case_data.place_of_residence %></td>
<td><%= case_data.diagnosis.illness %></td>
<td><%= case_data.confirmed_at %></td>
</tr>
<% end %>
</tbody>
</table>
Я был бы очень признателен за любой ввод!
Ответ №1:
Я думаю, что where возвращает массив записей, поэтому вам нужно сначала выполнить конкатенацию в вашем запросе:
@district = District.includes(:cases).where(id: 1).first
Или еще проще вместо использования where вы можете использовать find:
Редактировать: я допустил ошибку, используя find
метод, это должен быть правильный способ получения района:
@district = District.includes(:cases).find(1)
Кроме того, нет проблемы n 1, которую нужно исправить при извлечении только одной записи, чтобы вы могли безопасно удалить включенную часть запроса:
@district = District.find(1)
Комментарии:
1. Вау, спасибо за быстрый ответ! Первое решение сработало! Но что мне делать, когда я хочу использовать district_id текущего пользователя? Можете ли вы помочь мне с этим? Я думаю, тогда я должен использовать where(…) .
2. Учитывая, что в
has_many :users
вашей модели района есть ассоциация, вы можете добавитьbelongs_to :district
ассоциацию в пользовательскую модель, затем вы можете получить правильное значение либо с помощью идентификатора, либо модели, что-то вроде:@district = District.includes(:cases).find(current_user.district_id)
или более чистым способом:@district = District.includes(:cases).find(current_user.district)