У меня есть 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)
Мои вопросы:
- Почему тесты ищут Standard_tasks вместо tasks_standards?
- Как мне создать standard.tasks или task.standards в моем контроллере?Нужно ли создавать объект StandardTask?
- Теперь я знаю ответ на этот вопрос ... почему я получаю
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 в фикстурах, и он не был удален, когда я уничтожил эту миграцию / модель