阅读更多

6顶
0踩

编程语言

翻译新闻 5 个常见的 Rails 开发误区

2012-05-15 15:16 by 副主编 wangguo 评论(3) 有7403人浏览
本文作者是一名Rails开发者,他总结了在Rails开发过程中的一些常见误区。文章内容如下:

我使用Rails已经有一段时间了,在这期间我看了大量的Rails项目,下面的这五个常见的误区,我几乎在每一个Rails代码中都看到过。

1.  没有 schema 规范的迁移

数据模型是应用程序的核心。没有schema的约束,你的数据会因为项目代码上的bugs而慢慢变得糟糕,直到你无法相信库中的任何字段。这里有一个 Concact Schema:
create_table "contacts" do |t|
    t.integer  "user_id"
    t.string   "name"
    t.string   "phone"
    t.string   "email"
end

上面哪些需要更改呢?通常一个Contact必须依附于User,并且会有一个name 属性,这可以使用数据库约束来确保。可以添加“:null => false”,这样即使验证代码存在bugs,我们依然可以确保模型一致性,因为如果违反了null约束,数据库并不会允许模型保存这些数据。
create_table "contacts" do |t|
    t.integer  "user_id", :null => false
    t.string   "name", :null => false
    t.string   "phone"
    t.string   "email"
end

TIPS:使用“:limit => N”规范你的string类型字段的大小。Strings 默认255个字符,而phone字段应该不需要这么长吧!

2.  面向对象编程

大多数Rails开发人员并不写面向对象的代码。他们通常会在项目中写面向MVC的Ruby代码(把模型和控制器分开写在合适的位置)。通常是在lib目录下添加带有类方法的工具模块,仅此而已。但开发人员往往需要花费2-3年才能认识到“Rails就是Ruby。我完全可以创建一些简单的对象,并且不一定按照Rails建议的方式去封装它们。”

TIPS:对你调用的第三方服务使用facade(外观模式)。通过在测试中提供mock facade,你就不用在你的测试集中真的去调用这些第三方服务了。

3.  在 helpers中连接HTML

如果你正在创建helper,恭喜,至少说明你正在试图让你的视图层更整洁。但是开发人员经常不知道一些使用helpers创建标签的常见方式,这就导致了槽糕的字符串连接或者糟糕的插值形式。
str = "<li class='vehicle_list'> "
str += link_to("#{vehicle.title.upcase} Sale", show_all_styles_path(vehicle.id, vehicle.url_title))
str += " </li>"
str.html_safe

看吧,相当糟糕,而且容易导致XSS安全漏洞!让 content_tag 来拯救这些代码吧。
content_tag :li, :class => 'vehicle_list' do
  link_to("#{vehicle.title.upcase} Sale", show_all_styles_path(vehicle.id, vehicle.url_title))
end

TIPS:现在就开始在helper中使用blocks(代码块)吧。当产生内嵌的HTML时,嵌入的blocks更自然、更贴切。

4.  Giant Queries(大查询,比如载入整张表的查询)会把一切都加载到内存

如果你需要修正数据,你只需要遍历并且修正它,对吗?
User.has_purchased(true).each do |customer|
  customer.grant_role(:customer)
end

假设你有个百万级别客户的电商网站,假设每个用户对象需要500字节,上面的代码会在运行的时候消耗500M内存。

下面是更好的方式:
User.has_purchased(true).find_each do |customer|
  customer.grant_role(:customer)
end

find_each使用 find_in_batches 每次取出1000条记录,非常有效的降低了对内存的需求。

TIPS:使用 update_all 或者原始 SQL 语句执行大的更新操作。学习SQL可能需要花费点时间,不过带来的好处是明显的:你会看到100x的性能改善。

5.  代码审查

我猜你会使用GitHub,并且我进一步猜测你不会去pull requests(GitHub上的申请代码合并操作)。如果你需要花费一到两天去构建一个新特性,那么到一个分支上去做吧,然后发送一个 pull request。团队会审查你的代码,并且给出一些你没有考虑到的改进或者最新特性的建议。我保证这样会提高你的代码质量。我们在TheClymb项目中90%的改动都是通过这种方式完成的,并且这是100%值得去做的一个经验。

TIPS:不要没有经过任何测试就合并你的pull request。测试对保证应用的稳定性非常有价值,并且可以让你踏实地睡一个好觉。

英文原文:Five Common Rails Mistakes
6
0
评论 共 3 条 请登录后发表评论
3 楼 dohkoos 2013-04-21 13:08
find_each
update_all
这两个比较实用,记下了!
2 楼 lanqishao 2012-05-16 13:35
很实际 很多都遇到过
1 楼 jn615 2012-05-15 18:05
额, 好想是这么回事哦

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • SQL查找含有指定表名或者字段名的方法

    SELECT DISTINCT o.name, o.xtype   FROM syscomments c   INNER JOIN sysobjects o ON c.id=o.id   WHERE c.TEXT LIKE '%Timetable%'  select a.name from sysobjects a     inner join syscolumns b on a

  • 获取表的字段名

    sp_columns ­返回当前环境中可查询的指定表或视图的列信息­------------------------------------------------------­EXEC sp_columns @table_name = 表名(TABLE_NAME)­-----------------------------------------------------­

  • 【Web安全】Web开发中常见的安全误区

    下面来介绍Web开发中常见的一些安全误区。 如果我们使用Web框架,那么不必担心安全问题 一些流行的框架比如Rails和 Django在编写之初已考虑到安全性问题,并帮助防止常见的漏洞问题。然而,它们并不能阻止业务逻辑...

  • DevOps的常见误区

    在DevOps推广过程中有非常多的声音,有人说 DevOps 只适合特定的公司、特定的企业、特定的文化,他们的公司很难...所以在《DevOps Handbook》中专门有一个章节来谈一谈常见的 DevOps 误区,今天和大家一起分享解读下。

  • 架构设计和常见误区

    什么是架构和架构本质在软件行业,对于什么是架构,都有很多的争论,每个人都有自己的理解。此君说的架构和彼君理解的架构未必是一回事。因此我们在讨论架构之前,我们先讨论架构的概念定义,概...

  • java基础算法题,字节跳动Java开发

    SQL 语句执行慢的原因是面试中经常会被问到的,对于服务端开发来说也是必须要关注的问题。 在生产环境中,SQL 执行慢是很严重的事件。那么如何定位慢 SQL、慢的原因及如何防患于未然。接下来带着这些问题让我们开启...

  • AngularJS 开发中常犯的10个错误

    简介 AngularJS是目前最为活跃的Javascript框架之一,AngularJS的目标之一是简化开发过程,这使得AngularJS非常善于构建小型app...以下这份列表摘取了常见的一些AngularJS的错误用法,尤其是在app开发过程中。 ...

  • AngularJS开发人员最常犯的10个错误

    简介 AngularJS是目前最为活跃的Javascript框架之一,AngularJS的目标之一是简化开发过程,这使得AngularJS非常善于构建小型app...以下这份列表摘取了常见的一些AngularJS的错误用法,尤其是在app开发过程中。...

  • 在Ruby on Rails/Naked Objects精神指引下的域驱动开发框架

    这里我们不过多讨论ROR(Ruby on Rails),而是探讨如何以一个正确的方式快速开发J2EE。 现在的问题  现在我们J2EE开发碰到了什么问题呢? 让我们想象一下使用Spring和Hibernate开发一个J2EE WEB应用是...

  • 事实还是虚构?关于软件编程的 8 个神话

    尽管鼓舞人心的编码存在于创新应用程序的核心,并且开发人员可以通过编码表达他们的创造力,但我们看到他们中的许多人放弃了它。一个可能的原因是围绕编码存在许多神话,使其单调或不合逻辑。 但真的是这样吗? ...

  • AngularJS开发最常犯的10个错误

    简介 AngularJS是目前最为活跃的Javascript框架之一,AngularJS的目标之一是简化开发过程,这使得AngularJS非常善于构建小型app...以下这份列表摘取了常见的一些AngularJS的错误用法,尤其是在app开发过程中。 ...

  • 游戏开发学习指导

    ...然而因为我是在读书时自学C++的,也是游戏程序员(原问题中提到题主想从事游戏开发),觉得也许能提供一点意见供网友参考。 首先引一下2010年8月号《程序员》刊登的拙文《C++强大背后》最后

  • java开发安卓app电子书,含BATJM大厂

    Linux有架构,MySQL有架构,JVM也有架构,使用Java开发、MySQL存储、跑在Linux上的业务系统也有架构,应该关注哪一个?想要清楚以上问题需要梳理几个有关系又相似的概念:系统与子系统、模块与组建、框架与架构: 1

  • (转载)AngularJS开发人员最常犯的10个错误

    简介 AngularJS是目前最为活跃的Javascript框架之一,AngularJS的目标之一是简化开发过程,这使得AngularJS非常善于构建小型app原型,但...以下这份列表摘取了常见的一些AngularJS的错误用法,尤其是在app开发过程

  • 低成本单发单收激光测距传感器方案详解:硬件设计、代码实现及应用案例

    内容概要:本文详细介绍了低成本单发单收激光测距传感器的一站式解决方案,涵盖硬件设计、软件实现及其应用。硬件部分基于STM32F030F4P6芯片,搭配激光发射管和APD接收模块,通过精心设计的信号调理电路确保高精度测量。软件部分展示了关键代码片段,如初始化、测距算法和ADC配置,采用改进型飞行时间法(ToF)并通过DMA优化数据处理效率。此外,文章还讨论了调试过程中遇到的问题及解决方案,如环境光干扰和PCB布局优化。最终,该方案实现了0.05-50米范围内±1.5mm的测距精度,适用于多种应用场景。 适合人群:电子爱好者、硬件工程师、嵌入式系统开发者。 使用场景及目标:① DIY爱好者可以通过本方案进行个人项目的开发;② 企业可以基于此方案进行商业产品的开发,降低成本;③ 教育机构可以用作教学案例,帮助学生理解激光测距原理和技术实现。 其他说明:文章不仅提供详细的硬件和软件设计方案,还包括BOM清单、供应商信息和调试指南,有助于快速实现和优化项目。

  • 基于麻雀算法优化LSTM的时间序列预测——MATLAB实现及应用

    内容概要:本文详细介绍了将麻雀算法(SSA)应用于LSTM参数优化的方法及其MATLAB实现。首先,通过生成带噪声的正弦波数据模拟真实场景的数据扰动,然后定义适应度函数用于评估LSTM模型的表现。接着,利用麻雀算法的发现者和跟随者角色进行参数优化,最终实现了比随机调参更好的预测效果。文中不仅提供了完整的代码实现,还讨论了参数设置的经验值以及一些实用技巧,如数据归一化、早停机制和并行加速等。 适合人群:对机器学习尤其是深度学习有一定了解的研究人员和技术爱好者,熟悉MATLAB编程环境。 使用场景及目标:适用于需要提高时间序列预测精度的任务,如金融数据分析、天气预报等领域。主要目标是通过引入生物启发式的优化算法来提升LSTM模型的性能。 其他说明:文中提到的麻雀算法能够显著减少人工调参的工作量,并且相比传统的网格搜索法更加高效。此外,作者还分享了一些实践经验,帮助读者更好地理解和应用这一方法。

  • 西门子Smart200 PLC实现高效星三角降压启动子程序及应用

    内容概要:本文详细介绍了使用西门子Smart200 PLC实现高效的星三角降压启动子程序的方法。作者分享了具体的编程技巧,包括参数化的外部配置、定时器的巧妙运用以及故障处理机制。文中展示了完整的主程序调用示例和子程序内部逻辑,强调了模块化编程的优势,使得不同电机可以轻松复用相同的子程序,极大提高了调试和维护效率。此外,作者还提到了一些常见的调试陷阱和优化建议,如避免星三角同时导通、合理设置切换时间和加入硬件互锁等。 适合人群:从事PLC编程、自动化控制领域的工程师和技术人员,尤其是那些希望提高编程效率和代码复用性的从业者。 使用场景及目标:适用于需要频繁进行电机星三角降压启动的工业应用场景,如纺织厂、水泥厂等。主要目标是通过模块化编程减少重复劳动,提升系统稳定性和响应速度。 其他说明:文章不仅提供了详细的代码示例,还分享了许多实践经验,帮助读者更好地理解和应用这些技术。

  • 2025中国数字营销趋势报告.pdf

    2025中国数字营销趋势报告.pdf

Global site tag (gtag.js) - Google Analytics