如何根据查询插入多行?

Mis*_*cha 1 mysql activerecord ruby-on-rails ruby-on-rails-3

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

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

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
Run Code Online (Sandbox Code Playgroud)

我不喜欢每次创建新组时都必须遍历所有记录的事实.所以基本上我正在寻找一种使用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
Run Code Online (Sandbox Code Playgroud)

我想我可以运行上面的查询find_by_sql,但感觉不对,因为我INSERTing不是SELECTing.

或者我应该忘记这一点并继续循环我的文件夹记录,如上例所示?

提前致谢.

Chi*_*tan 8

你在寻找什么 ar-extensions


使用安装gem

sudo gem install ar-extensions
Run Code Online (Sandbox Code Playgroud)

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

require 'ar-extensions'
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

您也可以使用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
Run Code Online (Sandbox Code Playgroud)

已经在users表中插入了3个新行,只有一个查询!

更多关于它在这里,这里这里.