Mysql 在RubyonRails中查找或创建多个记录-“;查找或“创建所有”;

Mysql 在RubyonRails中查找或创建多个记录-“;查找或“创建所有”;,mysql,ruby-on-rails,Mysql,Ruby On Rails,在rails中执行“find_或create_all”的高效而优雅的方式是什么 给定: 姓名=[“鲍勃”、“约翰”、“杰克”、“希德”], 用户表 需要: 用户=[“#用户:0x3ae3a00”、“#用户:0x3ae3938”、“#用户:0x3ae3898”、“#用户:0x3ae37f8”] 仅当用户不存在时才创建该用户。 例如,如果用户表中只存在第一个和第四个条目,则中间解决方案-[“#用户:0x3ae3a00”、nil、nil、“#用户:0x3ae37f8”]也可以 一种方法是使用find_

在rails中执行“find_或create_all”的高效而优雅的方式是什么

给定:
姓名=[“鲍勃”、“约翰”、“杰克”、“希德”],
用户表

需要:
用户=[“#用户:0x3ae3a00”、“#用户:0x3ae3938”、“#用户:0x3ae3898”、“#用户:0x3ae37f8”]

仅当用户不存在时才创建该用户。

例如,如果用户表中只存在第一个和第四个条目,则中间解决方案-[“#用户:0x3ae3a00”、nil、nil、“#用户:0x3ae37f8”]也可以


一种方法是使用find_all_by_name并使用散列映射回names数组中的条目,但我想知道rails中是否有一种优雅而高效的方法。

如果我理解,您想获取一个名称数组并将其转换为一个用户数组

names = ["Bob","John","Jack","Sid"]
users = names.map{|name| User.find_or_create_by_name(name)}

这将返回一个用户对象数组。

如果我理解,您希望获取一个名称数组并将其转换为一个用户数组

names = ["Bob","John","Jack","Sid"]
users = names.map{|name| User.find_or_create_by_name(name)}

这将返回一个用户对象数组。

ar\u扩展提供了一个很好的解决方案

假设所讨论的表有一个具有唯一数据库索引的列,如果唯一列上没有匹配项,则可以使用大容量插入进行插入,如果唯一列上有匹配项,则可以跳过或更新行


在Envycast加载大型数据集涵盖了这种情况,ar_扩展提供了一个很好的解决方案

假设所讨论的表有一个具有唯一数据库索引的列,如果唯一列上没有匹配项,则可以使用大容量插入进行插入,如果唯一列上有匹配项,则可以跳过或更新行


在envycast加载大型数据集涵盖了这种情况

感谢您的回复,但问题是,如果数组的长度为1000,它将对数据库进行1000次单独的查询。如果在cron作业中每5分钟运行一次类似的操作,则效率会降低。进行单个查询(即按名称查找所有)的问题正在丢失数组中的位置。可以使用散列映射回数组中的位置,但我希望有一种高效而优雅的方法。如果顺序是随机的,并且希望保持相同的随机顺序,我不知道有什么好方法。如果基于数据库表存在某种顺序,则可以使用
User.find(:conditions=>{:name=>names},:order=>column\u name)
。或者在使用sort_by之后。我还将检查您的数据库文档,看看您是否可以通过编写自己的SQL来执行某些操作。感谢您的回复,但问题是,如果数组的长度为1000,它将对数据库进行1000次单独的查询。如果在cron作业中每5分钟运行一次类似的操作,则效率会降低。进行单个查询(即按名称查找所有)的问题正在丢失数组中的位置。可以使用散列映射回数组中的位置,但我希望有一种高效而优雅的方法。如果顺序是随机的,并且希望保持相同的随机顺序,我不知道有什么好方法。如果基于数据库表存在某种顺序,则可以使用
User.find(:conditions=>{:name=>names},:order=>column\u name)
。或者在使用sort_by之后。我还会检查您的数据库文档,看看您是否可以通过编写自己的SQL在那里做些什么。我想在rails中创建一个模型的多个实例,但找不到一个干净的方法。但是您到ar extensions gem的链接很有帮助。谢谢。我想在rails中创建一个模型的多个实例但是我找不到一个干净的方法来做。但是你的ar扩展gem链接很有用。谢谢