Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 4 在Rails 4中插入或更新_Ruby On Rails 4 - Fatal编程技术网

Ruby on rails 4 在Rails 4中插入或更新

Ruby on rails 4 在Rails 4中插入或更新,ruby-on-rails-4,Ruby On Rails 4,我有一个Rails 4应用程序,我正在与其他系统集成。每天我们都需要导入他们的数据库。部分或大部分数据应该已经导入到我们的数据库中(从以前的加载) 当我们尝试在数据库中插入现有对象时,如下所示: ... region = Region.new(id: id, name: name) region.save 我们得到这个错误: ActiveRecord::RecordNotUnique (Mysql2::Error: Duplicate entry '1' for key 'PRIMARY':

我有一个Rails 4应用程序,我正在与其他系统集成。每天我们都需要导入他们的数据库。部分或大部分数据应该已经导入到我们的数据库中(从以前的加载)

当我们尝试在数据库中插入现有对象时,如下所示:

...
region = Region.new(id: id, name: name)
region.save
我们得到这个错误:

ActiveRecord::RecordNotUnique (Mysql2::Error: Duplicate entry '1' for key 'PRIMARY':
我认为save方法在记录不存在时创建,或者在记录存在时更新。我错过了什么?我应该先在数据库中找到对象吗?比如:

region = Region.find(id)
if region
 #update fields
else 
 #create region
end
region.save

是否有一种更好、更有效、性能更好(考虑到将有数千条记录)的优雅Rails方法可以做到这一点?

我建议使用
find\u或\u initialize\u by
方法:

region = Region.find_or_initialize_by(id: id)

// do stuff

region.save
find\u或\u initialize\u by
的工作原理

# File activerecord/lib/active_record/relation.rb, line 200
def find_or_initialize_by(attributes, &block)
  find_by(attributes) || new(attributes, &block)
end

要小心,因为
find
方法必须找到记录,否则会引发异常

按id查找-可以是特定id(1)、id列表(1、, 5、6)或ID数组([5、6、10])如果找不到的记录 所有列出的ID,然后RecordNotFound将被提升。如果 主键是一个整数,按id查找强制使用 对我来说