Mysql 如何基于查询插入多行?

Mysql 如何基于查询插入多行?,mysql,ruby-on-rails,activerecord,ruby-on-rails-3,Mysql,Ruby On Rails,Activerecord,Ruby On Rails 3,我正在开发一个具有文件夹、组和权限的系统。权限决定不同组在每个文件夹中可以执行的操作。因此,每当我创建一个新组时,我都希望在每个文件夹的权限表中添加一条记录,描述新组在该文件夹中可以执行的操作 目前,我正在系统中的所有文件夹中循环,并为每个文件夹添加权限记录: group = Group.create(params) Folder.all.each do |folder| Permission.create! do |permission| permission.folder =

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

目前,我正在系统中的所有文件夹中循环,并为每个文件夹添加权限记录:

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\u by\u sql
运行上面的查询,但这感觉不对,因为我是
插入
,而不是
选择

或者我应该忘记这一点,继续循环我的文件夹记录,就像上面的例子一样


提前感谢。

您是在寻找最“红宝石般优雅”的做事方式,还是最快的?为什么不直接从activerecord调用SQL查询?另一个解决方案是将查询放入数据库函数中,并从web应用程序调用该函数。也许维护起来有点困难,但性能却有了惊人的提升,尤其是当你的web应用程序中有很多文件夹时。

你在寻找最“红宝石般优雅”的做事方式,还是最快的?为什么不直接从activerecord调用SQL查询?另一个解决方案是将查询放入数据库函数中,并从web应用程序调用该函数。也许维护起来有点困难,但性能却有了惊人的提升,尤其是当你的web应用中有很多文件夹时。

这就是我在rails/activerecord中处理自定义sql的方法(包括创建技巧之后!)

类组sql=这就是我在rails/activerecord中处理自定义sql的方式(包括创建技巧之后!)

类组ar扩展

使用以下命令安装gem

sudo gem install ar-extensions
将gem包含在environment.rb中(或直接包含在要插入的模型中)

并在一个
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个新行,仅使用单个查询

关于它的更多信息,以及。

您正在寻找的是
ar扩展

使用以下命令安装gem

sudo gem install ar-extensions
将gem包含在environment.rb中(或直接包含在要插入的模型中)

并在一个
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个新行,仅使用单个查询


更多信息,以及。

谢谢您的回答。我想最简单的方法是从ActiveRecord调用SQL。我以前使用过
find\u by_-sql
,但它似乎不合适,因为我不是
选择
,而是
插入
。如果您有任何代码示例,我将不胜感激。与此同时,我将开始一个小赏金,看看我是否能得到更多的建议。谢谢你的回答。我想最简单的方法是从ActiveRecord调用SQL。我以前使用过
find\u by_-sql
,但它似乎不合适,因为我不是
选择
,而是
插入
。如果您有任何代码示例,我将不胜感激。与此同时,我将开始一个小赏金,看看我是否可以得到更多的建议。谢谢,听起来像我在寻找的!我明天会看它,如果它能满足我的需要,我会给你赏金。这对ruby/rails的大规模插入非常有用。但是,您基本上希望从另一个表中插入mass。johno似乎是对的。这似乎不符合我上面所描述的。对不起,看来我不得不接受约翰诺的回答。谢谢,听起来像是我要找的!我明天会看它,如果它能满足我的需要,我会给你赏金。这对ruby/rails的大规模插入非常有用。但是,您基本上希望从另一个表中插入mass。johno似乎是对的。这似乎不符合我上面所描述的。对不起,看来我得同意约翰诺的回答了。谢谢。我看过ar扩展,你是对的:它不允许我基于查询导入记录。我会接受你的回答,给你赏金,但我还有一个问题。我希望这个应用程序能够处理不同类型的数据库,Rails的布尔数据类型在MySQL中变成tinyint(1)。因此,从文件夹
中选择id、{id}、'true'、'true'、'true'、'true'、'true'将失败,因为MySQL期望的是
0
1
,而不是
true
false
。有什么建议吗?谢谢。我看过ar扩展,你是对的:它不允许我基于查询导入记录。我会接受你的回答,给你赏金,但我还有一个问题。我希望这个应用程序能够处理不同类型的数据库,Rails的布尔数据类型在MySQL中变成tinyint(1)。因此,从文件夹
中选择id、{id}、'true'、'true'、'true'、'true'、'true'将失败,因为MySQL期望的是
0
1
,而不是
true
false
。有什么建议吗?