在尝试实现类似于MAC OS Finder的ruby复制机制时,我遇到了一个有趣的问题。我需要尝试执行以下操作。我有一个包含以下字段的ruby对象:
song.title = 'RocketMan'
song.slug = 'rocket-man'在Mongoid Slug的帮助下,如果我要.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.For复制下面的例子,请注意“原始对象”,它在这个问题中起着重要的作用。
##### ORIGINAL #####
song.title = 'RocketMan'
song.slug = 'rocket-man'
#.clone
song.title = 'RocketMan'
song.slug = 'rocket-man-1'如果我对原始的ruby对象执行clone操作,我会得到以下结果:
song.title = 'RocketMan'
song.slug = 'rocket-man-2'如果我使用slug rocket-man-1来clone对象,将会产生以下结果。
song.title = 'RocketMan'
song.slug = 'rocket-man-1-1'如果再克隆一次,我会得到'rocket-man-1-2‘等等。
有没有什么gem或算法可以用来模仿MAC OS Finder的功能?在我看来,无论我在mac os中使用什么文件或它的副本来复制,我都会得到正确的增量。使用ruby和mongoid-slug,如果我想模仿Finder,我只需要克隆原始对象。我正在处理的这个项目中的用户可以克隆原始和/或克隆。如果他们复制副本,那么整个命名约定就不起作用了。
如果任何人有一些见解,我将不胜感激。此外,只是为了澄清一下,插件的生成并不重要。我最感兴趣的是尝试通过复制创建以下标题:
Rocket Man
Rocket Man Copy
Rocket Man Copy 2
Rocket Man Copy 3等。
发布于 2021-01-25 22:21:58
您可以使用正则表达式来匹配给定的标题并生成后续的标题:
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"它还可以像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_title,直到找到一个不存在的标题,例如:
title = "Rocket Man"
title = next_title(title) while Song.exists?(title: title)https://stackoverflow.com/questions/65877584
复制相似问题