Запись начального файла и получение синтаксической ошибки и Null:Violation Error

Я пытаюсь написать начальный файл, который будет генерировать случайный Kudo. У Kudo есть Заголовок, Контент (оба сгенерированы с помощью драгоценного камня Faker), но это не проблема. Kudo также имеет внешние ключи Giver_id и Receiver_id. И я хочу, чтобы мой Kudo генерировался случайным образом между разными пользователями. И я как бы вслепую экспериментировал с другим синтаксисом (я супер новичок в рельсах;)). Итак, мой исходный файл выглядит так

employees = Employee.create!([{email: Faker::Internet.email(domain: 'gmail.com'), password: 'password'},{email: Faker::Internet.email(domain: 'gmail.com'), password: 'password'},...])

kudos = Kudo.create!(Title: Faker::Adjective.positive, Content: Faker::Company.bs, Kudo.new(giver:Employee.create()), Kudo.new(receiver:Employee.create()))

И это дает мне синтаксическую ошибку

SyntaxError: /home/valar/Dokumenty/ERP_v1/db/seeds.rb:9: syntax error, unexpected ',', expecting => ...o.new(giver:Employee.create()), Kudo.new(receiver:Employee.c... ...                  /home/valar/Dokumenty/ERP_v1/db/seeds.rb:9: syntax error, unexpected ')', expecting end-of-input ...ew(receiver:Employee.create()) ... ... ...                            ^

И я также попытался сделать так, чтобы мой начальный файл выглядел так

kudos = Kudo.create!(Title: Faker::Adjective.positive, Content: Faker::Company.bs, giver:Employee.create(), receiver:Employee.create())

Но я продолжаю получать ошибку null:violation

rake aborted!
ActiveRecord::NotNullViolation: PG::NotNullViolation: ERROR:  null value in column "giver_id" violates not-null constraint

Вот модели. Сотрудник

class Employee < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable
  has_many :given_kudos, class_name: 'Kudo', foreign_key: 'giver_id'
  has_many :received_kudos, class_name: 'Kudo', foreign_key: 'receiver_id'
end

И Кудо:

class Kudo < ApplicationRecord
  validates :Title, presence: true
  validates :Content, presence: true
  belongs_to :giver, class_name: 'Employee'
  belongs_to :receiver, class_name: 'Employee'
end

И мой файл схемы:


ActiveRecord::Schema.define(version: 2023_01_20_162230) do

  # These are extensions that must be enabled in order to support this database
  enable_extension "plpgsql"

  create_table "employees", force: :cascade do |t|
    t.string "email", default: "", null: false
    t.string "encrypted_password", default: "", null: false
    t.string "reset_password_token"
    t.datetime "reset_password_sent_at"
    t.datetime "remember_created_at"
    t.index ["email"], name: "index_employees_on_email", unique: true
    t.index ["reset_password_token"], name: "index_employees_on_reset_password_token", unique: true
  end

  create_table "kudos", force: :cascade do |t|
    t.string "Title", null: false
    t.text "Content", null: false
    t.integer "giver_id", null: false
    t.integer "receiver_id", null: false
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
  end

end

`

Я пробовал возиться с паретезами, фигурными скобками и квадратными скобками. Может кто-нибудь, пожалуйста, исправьте мой начальный файл, потому что он сводит меня с ума. Я знаю, что это нубская проблема, но, тем не менее, это серьезная проблема для меня на моем этапе обучения.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
60
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вот пример того, как вы можете обновить свой исходный файл, чтобы правильно создать случайное Kudo со случайным дающим и получателем:

employees = Employee.create!([{email: Faker::Internet.email(domain: 'gmail.com'), password: 'password'},{email: Faker::Internet.email(domain: 'gmail.com'), password: 'password'},...])

# randomly select a giver and receiver from the employees array
giver = employees.sample
receiver = employees.sample

# create the Kudo with the randomly selected giver and receiver
kudos = Kudo.create!(Title: Faker::Adjective.positive, Content: Faker::Company.bs, giver: giver, receiver: receiver)

Это случайным образом выберет сотрудника из массива сотрудников, который будет дарителем и получателем нового Kudo. Убедитесь, что вы уже создали сотрудников, прежде чем создавать kudos.

Не совсем так, как я хотел это решить, но это работает. Спасибо, сэр, за это решение.

Wojtek 22.01.2023 18:11
Ответ принят как подходящий

Первая синтаксическая ошибка связана с тем, что create ожидает либо хеш, либо массив хэшей.

Когда вы назвали это:

kudos = Kudo.create!(Title: Faker::Adjective.positive, Content: Faker::Company.bs, Kudo.new(giver:Employee.create()), Kudo.new(receiver:Employee.create()))

Вы предоставили ключи для «Заголовок» и «Содержание», но затем не предоставили ключи для последних двух аргументов, поэтому это недействительный хэш (или массив хэшей).

Если бы вы добавили ключи «даритель» и «получатель», вы бы получили синтаксическую ошибку (как вы сделали, когда получили вторую ошибку).

Ваша вторая ошибка заключается в том, что, хотя вы вставили синтаксическую ошибку, предоставив действительный хеш, идентификатор одного или обоих методов Employee.create() не удалось сохранить в базе данных, и результирующий объект, возвращаемый create, имеет нуль для там id, который не прошел проверку столбцов Kudo giver_d и reciever_id в схеме. Я никогда не использовал Devise, но я предполагаю, что ему нужно что-то передать create, чтобы создать действительного сотрудника, которого можно сохранить в базе данных.

kudos = Kudo.create!(Title: Faker::Adjective.positive, Content: Faker::Company.bs, giver:Employee.create(), receiver:Employee.create())

Теперь это решение, на которое я надеялся. Я, наконец, заставил его работать, вставив бит Faker от сотрудников в круглые скобки вашего метода Employee.create(), как это giver:Employee.create!(email: Faker::Internet.email(domain: 'gmail.com'), password: 'password'), receiver:Employee.create(email: Faker::Internet.email(domain: 'gmail.com'), password: 'password')

Wojtek 23.01.2023 10:07

Другие вопросы по теме