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





Вот пример того, как вы можете обновить свой исходный файл, чтобы правильно создать случайное 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.
Первая синтаксическая ошибка связана с тем, что 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')
Не совсем так, как я хотел это решить, но это работает. Спасибо, сэр, за это решение.