Rails 5 Не удалось найти связь для таблицы соединений, проверить поиск имени обратной таблицы - PullRequest
0 голосов
/ 05 июля 2019

У меня есть 3 вопроса о has_many: через отношения и о некоторых ошибках, я не понимаю, что получаю с настройкой, которую пытаюсь создать.Сначала я опишу, что я настроил:

У меня есть модель задач

class Task < ApplicationRecord
  has_many :task_standards
  has_many :standards, through: :task_standards
end

и стандартная модель

class Standard < ApplicationRecord
  has_many :task_standards
  has_many :tasks, through: :task_standards
end

Мне нужна была связь междуЗадачи и стандарты, которые также имеют другое поле, поэтому я сгенерировал модель TaskStandard

class TaskStandard < ApplicationRecord
  belongs_to :task
  belongs_to :standard
end

, которая создала миграцию 20190704213323_create_task_standards.rb

class CreateTaskStandards < ActiveRecord::Migration[5.2]
  def change
    create_table :task_standards do |t|
      t.belongs_to :task, index: true
      t.belongs_to :standard, index: true
      t.string :level

      t.timestamps
    end
  end
end

Я вижу таблицу task_standards в базе данных

                                         Table "public.task_standards"
   Column    |            Type             | Collation | Nullable |                  Default                   
-------------+-----------------------------+-----------+----------+--------------------------------------------
 id          | bigint                      |           | not null | nextval('task_standards_id_seq'::regclass)
 task_id     | bigint                      |           |          | 
 standard_id | bigint                      |           |          | 
 level       | character varying           |           |          | 
 created_at  | timestamp without time zone |           | not null | 
 updated_at  | timestamp without time zone |           | not null | 
Indexes:
    "task_standards_pkey" PRIMARY KEY, btree (id)
    "index_task_standards_on_standard_id" btree (standard_id)
    "index_task_standards_on_task_id" btree (task_id)

Я выполнил свои тесты, но получил ошибку: ActiveRecord::StatementInvalid: ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR: relation "standards_tasks" does not exist.Я удалил и создал базы данных среды тестирования и разработки, откатился и перезапустил миграцию.

Я подошел к консоли Rails и попытался создать задачу, а для стандартов задачи установил массив новыхзадач, но консоль выдает ошибку, ActiveRecord::HasManyThroughAssociationNotFoundError (Could not find the association :standard_tasks in model Task) ... и если я пытаюсь создать стандарт и добавить к нему задачи, я получаю то же самое, но в обратном порядке: (Could not find the association :task_standards in model Standard)

Мои вопросы:

  1. Почему тесты ищут Standard_tasks вместо tasks_standards?
  2. Как мне создать standard.tasks или task.standards в моем контроллере?Нужно ли создавать объект StandardTask?
  3. Теперь я знаю ответ на этот вопрос ... почему я получаю could not find the association :standard_tasks in model Task в консоли, я еще не добавил has_many :task_standards в моем стандарте.рб и таск.рб.Все, что у меня было, это has_many :standards, through :task_standards (дох!)

Обновление: я обнаружил, откуда возникла проблема со "standard_tasks" в моих тестах: у меня было старое поколение моделей, которое имелосоздал standard_tasks.yml в фикстурах, и он не был удален, когда я уничтожил эту миграцию / модель

1 Ответ

0 голосов
/ 05 июля 2019

Проблема с тестами (ActiveRecord::StatementInvalid: ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR: relation "standards_tasks" does not exist) была в остаточном файле, оставшемся после уничтожения предыдущего поколения моделей.В test / fixtures был файл standards_tasks.yml.Когда я удалил этот файл .yml, тесты запустились, как и ожидалось.

Проблема с could not find the association :standard_tasks in model Task в консоли была вызвана отсутствием самой таблицы отношений в моделях, с которыми я работал.Хотя у меня было has_many :tasks, through :task_standards, я еще не добавил has_many :task_standards в мой standard.rb и аналогично task.rb.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...