写种子文件,得到语法错误和Null:违规错误



我试图写一个种子文件,将生成一个随机工藤。工藤有一个标题,一个内容(都是用Faker宝石生成的),但这些都不是问题。工藤还有一个giver_id和一个receiver_id外键。我想让我的工藤在不同的用户之间随机生成。我一直在盲目地尝试不同的语法(我是rails的新手;))。所以我的种子文件是这样的

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:违例错误

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

和我的schema文件:


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

我试着弄乱了括号、花括号和方括号。谁能修复我的种子文件,因为它快把我逼疯了。我知道这是一个新手问题,但在我的学习阶段,这是一个严重的问题。

第一个语法错误是因为create需要一个哈希或一个哈希数组。

当你调用这个时:

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

您提供了"Title"one_answers";Content"但是你没有为最后两个参数提供键,所以它不是一个有效的哈希(或哈希数组)

如果你添加了"give "one_answers";receiver"键,那么你就会得到语法错误(就像你得到第二个错误时所做的那样)。

你的第二个错误是因为当你通过提供一个有效的哈希来粘贴语法错误时,一个或两个Employee.create()方法的id被失败地保存到数据库中,并且create返回的结果对象的id为nil,这在Kudo giver_d和reciever_id列上的验证失败。我从未使用过设计,但我假设它需要传递给create的东西,以便创建一个可以保存到数据库的有效雇员。

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

下面是一个示例,说明如何更新种子文件以正确创建一个随机的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)

这将从employees数组中随机选择一个员工作为新工藤的给予者和接收者。请确保在创建荣誉之前已经创建了员工。

最新更新