Ruby on rails Rails动态创建模型并使用它

Ruby on rails Rails动态创建模型并使用它,ruby-on-rails,ruby,rake-task,Ruby On Rails,Ruby,Rake Task,我正在创建一个模型,其名称是rake任务中的输入参数。在完成rake任务之后,我希望使用模型插入数据 例如,我用输入Apple调用我的rake任务,并创建了Apple模型。然后我想在另一个rake任务中插入所有([{name:x},{name:y}…]),但是我得到了name错误:未初始化常量Apple 这里有一个我正在做的事情的流程的更好的图片 Rake::Task["create:fruit"].invoke("Apple") # create model here Rake::Task["

我正在创建一个模型,其名称是rake任务中的输入参数。在完成rake任务之后,我希望使用模型插入数据

例如,我用输入Apple调用我的rake任务,并创建了Apple模型。然后我想在另一个rake任务中插入所有([{name:x},{name:y}…]),但是我得到了
name错误:未初始化常量Apple

这里有一个我正在做的事情的流程的更好的图片

Rake::Task["create:fruit"].invoke("Apple") # create model here
Rake::Task["create:insert"].invoke("Apple") # insert data here but getting error
这是我在第二个rake任务中处理输入的方式:

task :insert, [:name] do |t, args|
    fruit = args.name 
    fruit.classify.constantize.insert_all(xxx)
end

有什么建议吗?

我创建了一个新项目,并尝试了您的代码。我认为问题出在这方面

fruit.classify.constantize.insert_all(xxx)
下面的代码工作并创建新记录。我使用一个简单的
rake
命令来运行它

create.rake
文件

namespace :create do
  desc "TODO"
  task :insert, [:name] do |t, args|
    klass = Object.const_get(args.name)
    klass.create([{name: 'x'},{name: 'y'}])
    p klass.count # testing new records have been saved
  end
end
require File.expand_path('../config/application', __FILE__)

Rails.application.load_tasks

task :default do
  Rake::Task["create:insert"].invoke("Apple")
end
Rakefile
文件

namespace :create do
  desc "TODO"
  task :insert, [:name] do |t, args|
    klass = Object.const_get(args.name)
    klass.create([{name: 'x'},{name: 'y'}])
    p klass.count # testing new records have been saved
  end
end
require File.expand_path('../config/application', __FILE__)

Rails.application.load_tasks

task :default do
  Rake::Task["create:insert"].invoke("Apple")
end

我创建了一个新项目并尝试了你的代码。我认为问题出在这方面

fruit.classify.constantize.insert_all(xxx)
下面的代码工作并创建新记录。我使用一个简单的
rake
命令来运行它

create.rake
文件

namespace :create do
  desc "TODO"
  task :insert, [:name] do |t, args|
    klass = Object.const_get(args.name)
    klass.create([{name: 'x'},{name: 'y'}])
    p klass.count # testing new records have been saved
  end
end
require File.expand_path('../config/application', __FILE__)

Rails.application.load_tasks

task :default do
  Rake::Task["create:insert"].invoke("Apple")
end
Rakefile
文件

namespace :create do
  desc "TODO"
  task :insert, [:name] do |t, args|
    klass = Object.const_get(args.name)
    klass.create([{name: 'x'},{name: 'y'}])
    p klass.count # testing new records have been saved
  end
end
require File.expand_path('../config/application', __FILE__)

Rails.application.load_tasks

task :default do
  Rake::Task["create:insert"].invoke("Apple")
end

我怀疑这是可行的。还是要检查一下为什么你需要耙子?为什么不能使用标准rails迁移?这看起来像是一个反模式的IMHO。创建迁移/模型是一项手动任务,我正在尝试使用rake任务自动创建迁移。我已经成功地做到了这一点。我只需要在创建的模型中插入数据进行测试,并尝试使用Rails 6
insert_all
而不是执行SQL查询。我怀疑这是否可行。还是要检查一下为什么你需要耙子?为什么不能使用标准rails迁移?这看起来像是一个反模式的IMHO。创建迁移/模型是一项手动任务,我正在尝试使用rake任务自动创建迁移。我已经成功地做到了这一点。我只需要将数据插入到创建的模型中进行测试,并尝试使用Rails 6
insert_all
而不是执行SQL查询。奇怪的是,我仍然得到相同的错误。可能是因为我在rspec测试中运行了两个raske任务?您的rake任务的目的是什么?是否只想在数据库中植入种子以运行测试?我的rake任务的目的是创建依赖于规范的模型。我阅读规范文件并基于它们创建模型,rake任务动态创建迁移。也就是说,如果您有具有表架构的文件,您可以将它提供给rake任务,它将为您创建表。我仍然可以创建一个SQL字符串,并通过
ActiveRecord::Base.connection.execute
执行SQL,但我想使用Rails 6
insert.all
ifpossible@Ayudh你能用simple
Apple.insert\u all
call替换动态类吗?我确信模型必须可以从rake和rspec访问。奇怪的是,我仍然会得到相同的错误。可能是因为我在rspec测试中运行了两个raske任务?您的rake任务的目的是什么?是否只想在数据库中植入种子以运行测试?我的rake任务的目的是创建依赖于规范的模型。我阅读规范文件并基于它们创建模型,rake任务动态创建迁移。也就是说,如果您有具有表架构的文件,您可以将它提供给rake任务,它将为您创建表。我仍然可以创建一个SQL字符串,并通过
ActiveRecord::Base.connection.execute
执行SQL,但我想使用Rails 6
insert.all
ifpossible@Ayudh你能用simple
Apple.insert\u all
call替换动态类吗?我确信模型必须可以从rake和rspec访问