`
CaiDeHen
  • 浏览: 94251 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

万恶的"delete",慎用数组的delete

    博客分类:
  • ruby
阅读更多
    一直以来我的网站存在着一个令人很崩溃的问题。就是用户上传的图片会丢失。而且是连带相册一起丢失。开始还以为是什么地方误删了,冲突了。查了很久很久无果。关键是这个BUG并不是一定出现。而且,我测试时就从来没碰到过。
    昨天一个用户刚注册,开始上传图片。我就密切注意。过了一会儿,果不然,相册丢失了。很纳闷。打开production.log看了N久。没发现异常啊。注:里面我没加sql的log。太多了。
    但是这个问题很郁闷,而且已经郁闷很长一段时间了。这个用户还好。又继续新建相册,传照片。一会儿。又没了。这就郁闷了。我就不得不重新开了sql的log。果不然,确实有album destroy的记录。很奇怪。
     于是我备份了该用户消失的相册。(手快)自己回复数据来做测试。(因为我上传从来不出现。RP啊RP)
     通过看sql的log。和每个页面调用。(tail 就是好用啊)终于发现了居然是载入用户首页的时候相册被删除的。太奇怪了。怎么会这样。打开controller。里面有一句:
@photos = @lovetree.show_photos(current_user)

那肯定是该句的问题。遂打开Lovetree模型。找到show_photos。才恍然大悟!
由于用户主页回去把用户设了访问权限的相册移开。我用的方法是先找到所有属于该用户的相册。然后:
albums.each{|a| albums.delete(a) unless a.authorize(user)}

本来意思是如果用户设了权限,就把该相册从albums数组中删除掉。最后留下的就显示。结果造成了并不是数组中去删除相册,而是直接把该相册也删除了。
万恶的delete啊。最后改成albums - [a]就对了。
太痛苦的经历了。告诫大家一下!慎用数组delete。
分享到:
评论
8 楼 xylffxyfpp 2009-02-16  
应该改成慎用each
7 楼 xylffxyfpp 2009-02-16  
a = [1,2,3,4,5,6]  
a.each do |x| a.delete(x) end 
puts a.inspect  # => [2,4,6]

是each的问题,用for就不会出错
6 楼 CaiDeHen 2009-01-09  
受教了,我也不知道当时为什么会在这个地方这样子用。其他地方也是用的select,这也是我之前为什么一直不知道为什么会出问题的地方。看来还是你们说的对,尽量避免使用有副作用的操作。
5 楼 wosmvp 2009-01-09  
感觉太乱了

为什么不在User模型中来个
named_scope :published,:conditions => ***


控制器来个
current_use.albums.published
4 楼 jiachengxi38 2009-01-09  
不知道楼主这样的逻辑想法从何而来,权限访问的思想好像在lZ这里有点怪异
3 楼 dennis_zane 2009-01-09  
这显然不应该采用有副作用的操作,select才是正道吧
2 楼 rubynroll 2009-01-09  
在Array#each里面删除Array的元素是一种极其危险的做法,你可以做一个实验:
a = [1,2,3,4,5,6]
a.each do |x| a.delete(x) end
puts a.inspect  # => [2,4,6]


楼主的场景应该用delete_if:
albums.delete_if do |a| not a.authorize(user) end

1 楼 hozaka 2009-01-09  
其实我觉得楼主是在绕了一个圈子。你的需求是选择出那些设置为公开的相册,而不是剔除那些设置为保密的相册。既然有现成的方法可以提供“选择”的功能,没必要再画蛇添足转两个弯。

两者的区别在于方法的不同,select 可以理解为仅仅是读的操作,即使被覆盖,充其量也是显示的数据不正确而已,因此属于安全的方法;而 delete 带有写操作的意味,如果被覆盖过,那么就有可能改变原有的数据,属于不一定安全的方法。这种区别尤其是在使用第三方扩展很多的时候会产生影响。

最后一点,LoveTree#albums 返回值严格来说不是一个单纯的数组,混入了 Associations 模块,可以参考一下源码

相关推荐

    万恶之源2011VIP内部135

    【万恶之源2011VIP内部135】是一个特定版本的网络安全工具,由“万恶之源网安基地”站长开发。这个工具的名称中提到的“135抓鸡”,实际上指的是在网络安全领域中寻找并控制易受攻击的服务器或计算机的行为,这些...

    万恶的Blogbus教程免费版.rar

    这篇"万恶的Blogbus教程免费版"很可能是针对初学者或者那些希望深入理解Blogbus平台特性的用户设计的。从提供的文件列表来看,我们有以下三个文件: 1. **下载说明.txt** - 这个文件可能包含了下载教程的具体步骤,...

    万恶的反对风格如果我

    很抱歉,但根据您提供的信息,标题"万恶的反对风格如果我"和描述"斯蒂芬告诉对方告诉对方告诉对方告诉对方的方式告诉对方公司法"似乎与IT知识不直接相关,同时也无法明确地指向任何特定的技术主题。标签"法大赛官方...

    万恶的斐波那契.exe

    万恶的斐波那契.exe

    万恶之源:伟大的迅雷!

    万恶之源:伟大的迅雷!

    android去万恶的广告补丁

    "android去万恶的广告补丁"是一个针对这一问题的解决方案,旨在帮助用户去除应用程序中的广告,提升使用舒适度。这个补丁由开发者首次发布,表达了他们希望通过提供这种服务来获得用户的支持,并承诺未来会有更多...

    万恶的前端内存泄漏及万善的解决方案详解.docx

    前端内存泄漏及解决方案详解 在前端开发中,内存泄漏是一个非常重要的主题。内存泄漏是指系统进程不再使用的内存没有及时释放,导致内存占用越来越高,轻则影响系统性能,重则导致进程崩溃。在本文中,我们将讨论...

    万恶的足球比赛.zip

    全国大学生电子设计竞赛(National Undergraduate Electronics Design Contest),试题,解决方案及源码。计划或参加电赛的同学可以用来学习提升和参考。程序均是实战案例,经过测试可直接运行。...

    万恶的凯撒加密1

    凯撒加密,又称为移位密码,是一种古老且基础的加密技术,源于古罗马时期的军事通信,用以保护敏感信息不被敌人截获。它的基本原理是将明文中的每个字母按照固定的距离在字母表上向前或向后移动,以此达到加密的效果...

    万恶的音乐符号1

    在音乐的世界里,符号是传达旋律、节奏和情感的关键元素。音乐符号的种类繁多,它们各有特定的含义,能够指示演奏者如何演绎乐曲。在这个故事中,超帆正面临一个挑战,他需要理解森森哼唱的一段曲子所包含的信息。...

    操作手册请勿而且万恶

    **集团在进行人力资源信息化建设的过程中,旨在通过先进的技术手段提升人力资源管理效率,强化集团的管控能力和决策支持。项目的核心目标是构建一个集平台化、开放性、集成性于一体的人力资源管理系统(E-HR),以...

    我认为二位二万恶玩儿

    玩儿玩儿万恶人恶趣味而且维尔萨芬撒大幅撒大幅

    C#小技巧 万恶的10字

    ### C#小技巧详解 #### 一、颜色值转换技巧 在C#中,颜色值的处理是非常常见的需求之一,特别是在进行UI设计时。这里介绍一个实用的小技巧:如何将`System.Drawing.Color`结构体的颜色值转换为16进制字符串,并反...

    《万恶迷糊尤物》第三技:笑看混战人1000字.docx

    《万恶迷糊尤物》第三技:笑看混战人1000字 本篇小说主要讲述了格湘和殷澈之间的故事,并揭示了格湘的真实身份。故事开头,格湘和殷澈之间发生了一些有趣的互动,殷澈表现出对格湘的保护和照顾。然而,安洁却指控格...

    万恶的Appuse-----Appuse2.X在MyEclipse之中的部署问题

    【标题】:“万恶的Appuse-----Appuse2.X在MyEclipse之中的部署问题” 在探讨Appfuse 2.x在MyEclipse中的部署问题前,我们先来了解下Appfuse和MyEclipse这两个关键概念。 Appfuse是一个开源项目,它提供了一种快速...

    vs2003远程调试(万恶的CSDN)

    文件中是远程调试用到的文件,调试方法如下: 1. 拷贝《vs2003远程调试文件》文件夹到目标机器任意位置 2. 运行StartMsvcmon.bat批处理 3. 保证需要调试的进程已经启动,同时在执行文件下有相应的pdb文件 ...

    SSM框架配置 底层配置万用模板(x)万恶之源(√)

    然而,如果配置过于通用,可能会带来问题,因为每个项目都有其特定的需求,过度模板化的配置可能会限制项目的灵活性,这可能是为什么描述中称其为“万恶之源”。 文件名为"meow",在上下文中可能表示这个压缩包里...

    删除万恶的空格与tab.txt

    因为工作中有人喜欢在,前面加空格,还有人喜欢吧tab搞得到处都是,所以写了一个这个文件,用来删除行尾的tab与奇怪的空格

    VS2003远程调度工具(万恶的CSDN)

    文件中是远程调试用到的文件,调试方法如下: 1. 拷贝《vs2003远程调试文件》文件夹到目标机器任意位置 2. 运行StartMsvcmon.bat批处理 3. 保证需要调试的进程已经启动,同时在执行文件下有相应的pdb文件 ...

    Winodws平台C++共享内存实现(万恶的CSDN)

    在Windows平台上,C++共享内存是一种高效的进程间通信(IPC, Inter-Process Communication)方法,允许不同的进程访问同一块内存区域。本项目提供了一个已经封装为C++类的实现,使得服务端可以写入数据,而客户端则...

Global site tag (gtag.js) - Google Analytics