Ruby on rails 如何在ruby中模拟Finder/Mac OS复制?
我有一个有趣的问题,我正在尝试实现一个类似于MacOSFinder的ruby复制机制。我需要试着做到以下几点。我有一个具有以下字段的ruby对象: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' 我遇到的问题是试图实现一
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'
如果我要用slugrocket-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通过调整代码,我终于能够解决我的问题了。谢谢你的帮助,这帮助我越过了终点线。