Почему ActiveRecord не удается создать с ошибкой «x должен существовать», а запрос «x.exists?» возвращает истину? - PullRequest
0 голосов
/ 09 июля 2019

Я, должно быть, упускаю что-то действительно очевидное, но здесь идет речь:

Я пытаюсь создать Наблюдение, которое ссылается на несколько других объектов: ученика, задачу, пользователя истандарт.

Но, когда я запускаю Observation.create!(...attributes), я получаю следующую ошибку:

ActiveRecord::RecordInvalid:         ActiveRecord::RecordInvalid: Validation failed: Task must exist, User must exist, Standard must exist, Student must exist

Тем не менее, перед строкой Observation.create! для каждого объекта, который я напечатал, примерно так:

user = User.find(params[:user])
print "User exists? #{User.exists?(params[:user])}"

, который напечатал User exists? true

Если существуют все записи (Задача, Пользователь, Стандарт, Студент), что может вызвать сбой Наблюдения с этой ошибкой?

Это миграция для наблюдения:

class CreateObservations < ActiveRecord::Migration[5.2]
  def change
    create_table :observations do |t|
      t.references :task, foreign_key: true
      t.references :user, foreign_key: true
      t.references :standard, foreign_key: true
      t.references :student, foreign_key: true

      t.timestamps
    end
  end
end

, а это модель:

class Observation < ApplicationRecord
  belongs_to :Task
  belongs_to :User
  belongs_to :Standard
  belongs_to :Student
end

Ответы [ 2 ]

1 голос
/ 09 июля 2019

Ваш код должен быть таким:

Все, что принадлежит аргументу, будет в нижнем регистре

class Observation < ApplicationRecord
      belongs_to :task
      belongs_to :user
      belongs_to :standard
      belongs_to :student
    end
1 голос
/ 09 июля 2019

Согласно документации по методу belongs_to:

def belongs_to(name, scope = nil, **options)
  reflection = Builder::BelongsTo.build(self, name, scope, options)
  Reflection.add_reflection self, name, reflection
end

Тогда использование :Task добавит в ваш проект другое отражение, чем использование :task, так как это разные объекты.

Просто обновите belongs_to аргументы в вашей модели с помощью их версии в нижнем регистре.

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