Fre*_*ind 4 ruby-on-rails fixtures
有一个表questions和一个数据文件questions.yml.假设没有"问题"模型.
'questions.yml'从表中有一些recode转储.
---
questions_001:
title: ttt1
content: ccc1
questions_002:
title: ttt2
content: ccc2
Run Code Online (Sandbox Code Playgroud)
我想从yml文件加载数据,将它们插入数据库.但我无法使用rake db:fixtures:load,因为它会将内容视为'erb'模板,这不是我想要的
所以我想编写另一个rake任务,手动加载数据.
我可以通过以下方式阅读记录:
File.open("#{RAILS_ROOT}/db/fixtures/#{table_name}.yml", 'r') do |file|
YAML::load(file).each do |record|
# how to insert the record??
end
end
Run Code Online (Sandbox Code Playgroud)
但我不知道如何插入它们.
编辑:
我试过了:
Class.new(ActiveRecord::Base).create(record)
Run Code Online (Sandbox Code Playgroud)
和
class Dummy < ActiveRecord::Base {}
Dummy.create(rcord)
Run Code Online (Sandbox Code Playgroud)
但没有插入数据库
将日期从yml文件加载到以下内容后尝试此操作records:
class Question < ActiveRecord::Base
# Question model just to import the yml file
end
records.each { |record| Question.create(record) }
Run Code Online (Sandbox Code Playgroud)
您只需创建一个仅用于导入的模型.你不需要创建app/models/question.rb.只需在负责导入的脚本中编写上面的代码即可.
更新:
您可以使用以下功能:
def create_class(class_name, superclass, &block)
klass = Class.new superclass, &block
Object.const_set class_name, klass
end
Run Code Online (Sandbox Code Playgroud)
File.open("#{RAILS_ROOT}/db/fixtures/#{table_name}.yml", 'r') do |file|
YAML::load(file).each do |record|
model_name = table_name.singularize.camelize
create_class(model_name, ActiveRecod::Base) do
set_table_name table_name.to_sym
end
Kernel.const_get(model_name).create(record)
end
end
Run Code Online (Sandbox Code Playgroud)
要直接使用连接,您可以使用以下内容:
ActiveRecord::Base.connection.execute("YOUR SQL CODE")
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8996 次 |
| 最近记录: |