Rails: связана ли неопределенная ошибка NoMethodError с принадлежащим? - PullRequest
0 голосов
/ 30 ноября 2018

Мои модели следующие:

    class Project < ApplicationRecord
      belongs_to :workspace
      has_many :tasks, dependent: :destroy
    end

    class Task < ApplicationRecord
      belongs_to :person
      belongs_to :project
    end

    class Person < ApplicationRecord
      belongs_to :company
      has_many :tasks
    end

Итак, как вы можете видеть, каждая задача принадлежит проекту.В дополнение к этому, к каждой задаче прикреплен человек (который отвечает за задачу).В моей модели задач у меня есть project_id и person_id.

В моем представлении Tasks # Index я получаю NoMethodError.В представлении индекса это то, что вызывает ошибку:

    <% @task.each do |t| %>
        <tr>
            <td><%= t.person.id %></td>

Точная ошибка - "неопределенный метод" id "для nil: NilClass".

Мои ассоциации неверны?

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

Мне кажется, что ассоциации правильные.Если бы это было не так, ваше сообщение об ошибке жаловалось бы на task, у которого нет метода с именем person.

Вместо этого сообщение говорит вам, что t.person на самом деле nil.Я предполагаю, что @task на самом деле представляет собой набор задач;по крайней мере, один из них, кажется, скучает по человеку.

Если вы думаете, что в каждой задаче обязательно должен быть человек, я бы посмотрел мои данные, используя консоль rails или графический интерфейс вашей базы данных.Или используйте оператор безопасного доступа t&.person&.id, который позволит избежать этой ошибки и покажет вам, что происходит.

0 голосов
/ 30 ноября 2018

В вашей базе данных есть задача, которая не связана с человеком.Это означает, что ваша база данных в настоящее время:

  1. Позволяет tasks.person_id быть null.
  2. Не имеет значения Foreign_key для таблицы people на tasks.person_id
  3. Комбинация 1 и 2

См. Руководство по миграции Rails относительно внешних ключей здесь .

Решение:

  • Найти задачу безчеловек: Task.includes(:person).all.select { |t| t.person.nil? }, удалите эти задачи или назначьте им существующего человека
  • Добавьте миграцию, исправляющую вашу базу данных, убедитесь, что person_id является внешним ключом и не имеет значения null.

(Первая точка может быть заменена SQL-запросом LEFT JOIN, если у вас много задач, я предполагаю, что это не так).

...