Rails AntiPatterns: Best Practice Ruby on Rails Refactoring

Added by Dmytro Shteflyuk on , authored by Chad Pytel, Tammer Saleh

Rails AntiPatterns: Best Practice Ruby on Rails Refactoring
Started reading:
24th January 2011
Finished reading:
9th February 2011

Order on Amazon.com

Book rating: 6 of 10

Review

As developers worldwide have adopted the powerful Ruby on Rails web framework, many have fallen victim to common mistakes that reduce code quality, performance, reliability, stability, scalability, and maintainability. Rails™ AntiPatterns identifies these widespread Rails code and design problems, explains why they’re bad and why they happen—and shows exactly what to do instead.

The book is organized into concise, modular chapters—each outlines a single common AntiPattern and offers detailed, cookbook-style code solutions that were previously difficult or impossible to find. Leading Rails developers Chad Pytel and Tammer Saleh also offer specific guidance for refactoring existing bad code or design to reflect sound object-oriented principles and established Rails best practices. With their help, developers, architects, and testers can dramatically improve new and existing applications, avoid future problems, and establish superior Rails coding standards throughout their organizations.

I have mixed feelings about this book. First few chapters (about models, controllers, views, and web services, testing) were pretty neat: useful precise antipatterns definitions along with their solutions. Some of them are pretty obvious, but anyways I was enjoying the reading. Things changed at the end of the book. Chapters about databases and scaling are… kinda disturbing. Does the author believe that

1
@users = @account.users.order('LCASE(name)').limit(5)

is the right way to do such a things? Does he really recommends the following query to improve performance and fix scalability issues?

1
2
3
4
5
6
7
8
9
10
SELECT DISTINCT users.* FROM users
    INNER JOIN comments
        ON comments.user_id = users.id
    INNER JOIN users users_comments
        ON users_comments.id = comments.user_id
    INNER JOIN articles
        ON articles.id = comments.article_id
    INNER JOIN comments comments_articles
        ON comments_articles.article_id = articles.id
WHERE (articles.id IN (1) AND users.id != 1)

If you want to kill a few hours, you may check it out, but I will not recommend this book to my friends.