gpt4 book ai didi

mysql - 如何根据查询插入多行?

转载 作者:行者123 更新时间:2023-11-29 03:50:51 26 4
gpt4 key购买 nike

我正在开发一个具有文件夹、组和权限的系统。权限决定不同的组可以在每个文件夹中执行的操作。因此,每当我创建一个新组时,我都想在每个文件夹的权限表中添加一条记录,描述新组可以在该文件夹中执行的操作。

目前我只是循环遍历系统中的所有文件夹并为每个文件夹添加权限记录:

group = Group.create(params)

Folder.all.each do |folder|
Permission.create! do |permission|
permission.folder = folder
permission.group = group
permission.can_create = true
permission.can_read = true
permission.can_update = true
permission.can_delete = true
end
end

我不喜欢每次创建新组时都必须遍历所有记录的事实。所以基本上我正在寻找一种优雅的方式来使用 ActiveRecord 执行以下 SQL。

INSERT INTO permissions (folder_id, group_id, can_creat, can_read, can_update, can_delete)
SELECT id, #{group.id}, true, true, true, true
FROM folders

我想我可以使用 find_by_sql 运行上述查询,但感觉不对,因为我是INSERTing,而不是SELECTing .

或者我是否应该像上面的示例一样忘记这个并继续循环遍历我的文件夹记录?

提前致谢。

最佳答案

你要找的是ar-extensions


使用安装 gem

sudo gem install ar-extensions

将 gem 包含在您的 environment.rb 中(或直接在您想要插入的模型中)

require 'ar-extensions'

并在一个INSERT查询中使用

插入多条记录
fields = [:first_name, :last_name, :email]
data = [["glenn", "gillen", "foo@bar.com"],
["john", "jones", "jim@bar.com"],
["steve", "smith", "bar@foo.com"]]

User.import fields, data

您也可以使用 ActiveRecord 对象来完成。

data = [ 
User.new(:first_name => 'glenn', :last_name => 'gillen', :email => 'foo@bar.com'),
User.new(:first_name => 'john', :last_name => 'jones', :email => 'jim@bar.com'),
User.new(:first_name => 'steve', :last_name => 'smith', :email => 'bar@foo.com')
]

User.import fields, data

3 个新行已插入到用户表中,仅使用单个查询!

更多信息 here , herehere .

关于mysql - 如何根据查询插入多行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4256898/

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