我的嵌套模型如下所示
class Project < ActiveRecord::Base
has_many :tasks
accepts_nested_attributes_for :tasks
end
class Project::Task < ActiveRecord::Base
attr_accessible :task_id, :name
belongs_to :Project
end
我通过阅读csv文件构建的json数据:
"project": {
"name": "My Project Name",
"tasks_attributes": [
{"name": "Design prototype"},
{"name": "Home page UI prototype"},
{"name": "Other Miscellaneous task"}
]
}
我知道我可以让rails模型通过在json上面发布来创建跟踪控制器的方法来创建记录。
project_params = params.require(:project).permit(:name, tasks_attributes: [:name])
Project.new(project_params)
由于我将csv文件上传到服务器上并进一步转换为json,我想将json数据直接传递给模型以在db中创建记录(嵌套)。有没有办法做到这一点?
答案 0 :(得分:1)
要回答如何保存json数据,请按以下步骤操作:
data = your_json_here
instance = YourModel.new(JSON.parse(data))
#将您的json数据转换为哈希instance.save
未经测试,但这是我想到的最快的事情。 确保在保存数据之前检查参数(再次需要检查)
希望有所帮助!
答案 1 :(得分:1)
答案取决于您是否允许用户上传CSV文件,或者您是否在服务器上手动执行此操作。
-
如果您在服务器上执行此操作,我会使用Rake
task;如果您允许上传,则可以使用控制器操作。在这两种情况下,代码都会保持相似:
#CSV on Server
#lib/tasks/csv_process.rake
namespace :csv do
desc "Process the CSV"
task :process => :environment do
file_name = File["path/to/file"]
CSV.foreach(file_name, :headers => true) do |row|
Project.create row.to_hash
end
end
end
然后可以使用rake csv:process
运行此rake任务,#app/controllers/projects_controller.rb
class ProjectsController < ApplicationController
def create
file = project_params[:file]
CSV.foreach(file, :headers => true) do |row|
Project.new row.to_hash
end
end
private
def project_params
params.require(:project).permit(:file)
end
end
可以从服务器bash shell手动运行,也可以将其绑定到cron job
-
如果您想直接将CSV传递给您的应用(虽然我之前没有这样做过),您可以使用控制器操作,如下所示:
insert into auth_user(id, user_name)
values((select a from generate_series((select min(id) from auth_user)
,(select max(id)+1 from auth_user)
) as a
left join auth_user on (a = id )
where id is null order by a limit 1)
, 'new user')
答案 2 :(得分:0)
您可以使用CSV
类解析CSV。
它将创建一个Hash
,您将能够将其传递给您的模型。
但要注意传递哪些参数。在将它们发送到数据库之前检查它们。否则,您将面临不允许访问受保护属性的风险。例如,用户可以修改数据库中存在的role
属性。
您可以在Strong Parameters的文档中详细了解此漏洞。
快乐的编码:)。