gpt4 book ai didi

Ruby 类需要类变量,但仅在 Rake 任务中

转载 作者:数据小太阳 更新时间:2023-10-29 08:56:57 24 4
gpt4 key购买 nike

我试图用一些虚拟数据为我的数据库做种,所以我有这个种子文件:

db/seeds.rb

require 'require_all'
require_all 'lib'

Author.create(name: "Mark Twain")

我的Ruby模型及相关方法:

lib/作者.rb

class Author

attr_accessor :name, :id

def initialize(name, id=nil)
@name = name
@id = id
end

def self.make_object_from_row(row)
# [1, "Mark Twain"]
Author.new(row[1], row[0])
end

def self.create(name)
author = Author.new(name)
author.save
end

def save
if self.id.nil? # doesn't exist in the database yet
sql = <<-SQL
INSERT INTO authors (name)
VALUES (?)
SQL
DB.execute(sql, self.name)
sql = "SELECT last_insert_rowid()"
self.id = DB.execute(sql)[0][0]
else # just update the row in the db
sql = <<-SQL
UPDATE authors SET (name) = ? WHERE id = ?
SQL
DB.execute(sql, self.name, self.id)
end
end

拉克文件

require_relative './config/environment'

desc "Set up database"
task :db_setup do
author_sql = <<-SQL
CREATE TABLE IF NOT EXISTS authors(
id integer PRIMARY KEY,
name varchar(255)
);
SQL
DB.execute(author_sql)
end

desc "Seed database"
task :db_seed do
ruby "db/seeds.rb"
end

配置/环境.rb

require 'bundler/setup'
Bundler.require

# setting up the database connection (old way)
DB = SQLite3::Database.new("db/development.db")

require_relative '../lib/author.rb'

当我为 db_seed 运行 rake 任务时,出现错误。 lib/author.rb:26:in save': 未初始化常量 Author::DB (NameError)

db_setup Rake 任务工作正常。此外,如果我从我的控制台进行 pry 动,我可以毫无问题地实例化一个新作者(并将其写入数据库)。如果我从命令行运行种子文件,我会得到同样的错误。

我看到它正在 Author 类上寻找属性 DB,但我不明白为什么,或者为什么它不一致,因为我可以从命令行而不是从Rake 任务——如果变量未定义应该不会有什么不同,对吗?

(我也知道使用 ActiveRecord 会容易得多,但我现在不打算使用它)

最佳答案

当您看到诸如“未初始化的常量”之类的错误弹出,并且您确定已在某处的文件中定义了该常量时,请确保在出现错误的方法运行之前加载该代码。

在这种情况下,config/environment 似乎在引用 DB 之前未加载,因此无法完成。

由于 Ruby 搜索常量的方式,它显示为 Author::DB,因为代码在 Author 命名空间内运行,这就是搜索的起点。

关于Ruby 类需要类变量,但仅在 Rake 任务中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50844404/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com