Где Nometoderror?

#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)