Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/53.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 如何在ruby中模拟Finder/Mac OS复制?_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails 如何在ruby中模拟Finder/Mac OS复制?

Ruby on rails 如何在ruby中模拟Finder/Mac OS复制?,ruby-on-rails,ruby,Ruby On Rails,Ruby,我有一个有趣的问题,我正在尝试实现一个类似于MacOSFinder的ruby复制机制。我需要试着做到以下几点。我有一个具有以下字段的ruby对象: song.title = 'RocketMan' song.slug = 'rocket-man' 在的帮助下,如果我要.clone上述对象,我将得到以下结果。slug由mongoid slug gem功能设置 song.title = 'RocketMan' song.slug = 'rocket-man-1' 我遇到的问题是试图实现一

我有一个有趣的问题,我正在尝试实现一个类似于MacOSFinder的ruby复制机制。我需要试着做到以下几点。我有一个具有以下字段的ruby对象:

 song.title = 'RocketMan'
 song.slug = 'rocket-man'
在的帮助下,如果我要
.clone
上述对象,我将得到以下结果。slug由mongoid slug gem功能设置

 song.title = 'RocketMan'
 song.slug = 'rocket-man-1'
我遇到的问题是试图实现一个Mac类型的复制机制,我将模仿下面的算法。使用MAC OS Finder需要注意的是,无论我复制哪个文件,都会产生下一个增量

file.jpg
file copy.jpg
file copy 1.jpg
file copy 2.jpg
因此,如果我要复制上面的任何文件,那么接下来的文件将是file copy 3.jpg

现在,对于这个问题,我基本上是在尝试用ruby复制它。对于下面的例子,请注意“原始对象”,它在这个问题中起着重要的作用

##### ORIGINAL #####
song.title = 'RocketMan'
song.slug = 'rocket-man'

#.clone 

song.title = 'RocketMan'
song.slug = 'rocket-man-1'
如果我要
克隆
原始ruby对象,我会得到以下结果:

song.title = 'RocketMan'
song.slug = 'rocket-man-2'
如果我要用slug
rocket-man-1
克隆
对象,将产生以下结果

song.title = 'RocketMan'
song.slug = 'rocket-man-1-1'
如果再次克隆,我会得到“火箭人1-2”等等

是否有某种gem或算法可以用来模仿macosfinder的功能?在我看来,无论我在mac os中复制什么文件或它的副本,我都能得到正确的增量。使用ruby和mongoid slug,如果我想模仿Finder,我只需要克隆原始对象。我正在处理的项目中的用户可以克隆原始和/或克隆。如果他们要复制副本,那么整个命名约定就不起作用

如果有人有一些见解,我将不胜感激。另外,为了澄清,鼻涕虫的产生并不重要。我最感兴趣的是通过复制创建以下标题:

Rocket Man
Rocket Man Copy
Rocket Man Copy 2
Rocket Man Copy 3

等等。

您可以使用正则表达式匹配给定标题并生成后续标题:

def next_title(title)
  case title
  when /(.*) Copy (\d*[1-9]\d*)\z/
    "#{$1} Copy #{$2.to_i.succ}"
  when /(.*) Copy\z/
    "#{$1} Copy 2"
  else
    "#{title} Copy"
  end
end

next_title("Rocket Man")         #=> "Rocket Man Copy"
next_title("Rocket Man Copy")    #=> "Rocket Man Copy 2"
next_title("Rocket Man Copy 2")  #=> "Rocket Man Copy 3"
它还处理way Finder所处理的几个边缘情况:

next_title("Rocket Man Copy 1")   #=> "Rocket Man Copy 2"
next_title("Rocket Man Copy 02")  #=> "Rocket Man Copy 3"
next_title("Rocket Man Copy 0")   #=> "Rocket Man Copy 0 Copy"
next_title("Rocket Man Copy -1")  #=> "Rocket Man Copy -1 Copy"
next_title("Copy")                #=> "Copy Copy"
next_title("Copy 2")              #=> "Copy 2 Copy"
为了确保标题的唯一性,您必须反复调用
next\u title
,直到找到一个不存在的标题,例如:

title = "Rocket Man"
title = next_title(title) while Song.exists?(title: title)

谢谢你的反馈,斯蒂芬。你是对的,所以我把对象改为它真正代表的是一首歌。我希望你能帮我。谢伊。斯特凡,谢谢你的帮助,但现在还没到。我实施的解决方案与您的解决方案在同一个问题上卡住了。只有连续复制下一个副本时,此解决方案才有效。例如,使用上述解决方案,如果我复制原始的“火箭人”歌曲对象,我将得到两个“火箭人复制”对象。而不是“火箭人副本”和“火箭人副本2”。这是我有点纠结的棘手部分。@DanRubio为了做到这一点,你必须以某种方式存储生成的名称。不管是在内存中还是在数据库中。嘿@Stefan通过调整代码,我终于能够解决我的问题了。谢谢你的帮助,这帮助我越过了终点线。