Read my latest article: Announcing RailsDeveloper (posted Wed, 01 Sep 2010 17:01:00 GMT)

Using model constants for project sanity

Posted by Robby Russell Tue, 23 Jun 2009 06:39:00 GMT

80 comments Latest by discount ugg boots Thu, 02 Sep 2010 12:00:28 GMT

On one of our larger client projects (approx. 160 models and growing…) we have a specific model that we refer to quite a bit throughout our code. This model contains less than 10 records, but each of them sits on top of an insanely large and complex set of data. Each record refers to a each of their regions that our client does business in.

For example… we have, Australia, United Kingdom, Canada, United States, and so forth. Each of these regional divisions has their own company code, which are barely distinguishable from the next. They make sense to our client, but when we’re not interacting with those codes on a regular basis, we have to look constantly look them up again to make sure we’re dealing with the right record.

I wanted to share something that we did to make this easier for our team to work around these codes, which we should have thought of long ago.

Let’s take the following mode, Division. We only have about 10 records in our database, but have conditional code throughout the site that are dependent upon which divisions specific actions are being triggered within. Each division has various business logic that we have to maintain.

Prior to our change, we’d come across a lot of code like:

# For all divisions except Canada, invoices are sent via email
# In Canada, invoices are sent via XML to a 3rd-party service
def process_invoices_for(division)
  if division.code == 'XIUHR12'
    # trigger method to send invoices to 3rd party service
    # ...
  else
    # batch up invoices and send via email
    # ...
  end
end

An alternative that we’d also find ourselves using was.

if division.name == 'Canada'

Hell, I think I’ve even seen if division.id == 2 somewhere in the code before. To be fair to ourselves, we did inherit this project a few years ago. ;-)

Throughout the code base, you’ll find business rules like this. Our developers all agreed that this was far from friendly and/or efficient and worst of all, it was extremely error-prone. There have been a few incidents where we read the code wrong and/or got them confused with one another. We were lacking a convention that we could all begin to rely on and use.

So, we decided to implement the following change.

Model Constants

You might already use constants in your Ruby on Rails application. It’s not uncommon to add a few into config/environment.rb and call it a day, but you might also consider scoping them within your models. (makes it much easier for you to maintain them as well)

In our scenario, we decided to add the following constants to our division model.

class Division < ActiveRecord::Base
  AFRICA      = self.find_by_code('XYU238')
  ASIA        = self.find_by_code('XIUHR73')
  AUSTRALIA   = self.find_by_code('XIUHR152')
  CANADA      = self.find_by_code('XIUHR12')
  USA         = self.find_by_code('XIUHR389')
  # etc..
end

What this will do is load up ech of these constants with the corresponding object. It’s basically the equivallent of us doing:

if division == Division.find_by_code('XIUHR389')

But, with this approach, we can stop worrying about their codes and use the division names that we’re talking about with our clients. Our client usually approaches us with, “In Australia, we need to do X,Y,Z differently than we do in the other divisions due to new government regulations.”

if division == Division::CANADA
  # ...
end

case division
  when Division::AFRICA
    #
  when Division::AUSTRALIA
    # ...
end

We are finding this to be much easier to read and maintain. When we’re dealing with a lot of complex business logic in the application, little changes like this can make a big difference.

If you have any alternative solutions, we’d love to hear them. Until then, we’ve been quite pleased with this approach. Perhaps you’ll find some value in it as well.

Subscribe to my RSS feed Enjoying the content? Be sure to subscribe to my RSS feed.
Comments

Leave a response

  1. Avatar
    Neil Tue, 23 Jun 2009 07:07:46 GMT

    Hi Robby

    Would it be possible to extract the country codes out and use a method that determines whether or not a region code record wants invoices emailed right away or by third party? E.g.

    if division.needs_invoices_processing?

    But perhaps it’s a bad suggestion if you won’t be adding any more region codes or if all region codes need different behaviour from the rest….

  2. Avatar
    Robby Russell Tue, 23 Jun 2009 07:12:27 GMT Recommend me on Working with Rails

    Neil,

    Yeah, we do that quite a bit as well. There are some cases where we’re just doing something quirky (like changing copy in a flash message for one specific division, handling different tax rates, etc.). Using methods like you’ve suggested comes in handy, but mileage varies. :-)

  3. Avatar
    Nathan de Vries Tue, 23 Jun 2009 08:27:45 GMT

    What about using ActiveSupport::StringInquirer to achieve something like “division.name.australia?” or “division.name.usa?”?

  4. Avatar
    shane Tue, 23 Jun 2009 08:50:48 GMT

    First thought as I skimmed the article … often when I see ‘if’ statements I wonder about refactoring to move the behaviour to the objects … so you can just call division.process_invoices.

  5. Avatar
    Emilien Tue, 23 Jun 2009 08:59:53 GMT

    Hello Robby, What about using the “type” magic column and processing the custom behaviours in subclasses ?

  6. Avatar
    Morgan Roderick Tue, 23 Jun 2009 09:48:35 GMT

    If you’ve got such a short list and mostly use it for branching in your code, perhaps a few instance methods would go a long way towards (even more) readable code?

    
    if division.canada?
    # canada specific stuff
    end
    
    

    Would that work with case statements?

  7. Avatar
    Peter Harkins Tue, 23 Jun 2009 12:14:20 GMT

    Maybe you have other reasons to keep doing things this way, but it sounds like case where Tell, Don’t Ask would improve your code. In this situation, I’d probably give a Division an after_initialize to include a country-specific module of code.

    Or at the least, write ‘if division.invoice_by_email? ...’ because that’s the important question you’re asking that location is only a proxy for.

  8. Avatar
    Robby Russell Tue, 23 Jun 2009 14:34:36 GMT Recommend me on Working with Rails

    With regard to moving some of this into individual modules (per-division), one concern with this is that it makes it more difficult to look over the business rules for all the divisions within a specific method being called.

    For example, take the invoicing functionality.

    In our client application, we actually have rules like this:

    if Canada or USA
      # send via XML to 3rd party service (we call another method here)
    elsif Australia or New Zealand
      # build CSVs and FTP them
    else # rest of divisions
      # send emails
    end

    If we moved these down into modules (and separated them out), it’d make it much more daunting to check on an issue if we had to sift through multiple areas of code to figure out which regions were doing what and how.

    We do have a lot of methods in our Division model that we rely on for determining stuff, but still find ourselves needing to do comparisons in various places of the application.

  9. Avatar
    Chris Gunther Tue, 23 Jun 2009 18:02:35 GMT

    Hey guys,

    Nice article. I had a question about performance though. How often are those constant definitions called? Since in a production environment the classes are cached, would it be executed once then live until the server is restarted?

    Thanks, Chris

  10. Avatar
    Peter Harkins Tue, 23 Jun 2009 19:04:13 GMT

    Why do you find yourself looking over the code to compare divisions? Could you write a tool to extract the ‘process_invoice’ someone suggested to display them all side-by-side?

    I just really don’t like spreading logic out from the object into other scripts. Every time I’ve done it I’ve later realized that my code is clunky or hard to test or flaky because half the code for an object lives outside that object, making it harder to test and reason about.

    In any case, this issue is tangential to your post, which is quite nice, and I don’t mean to be the “ur doin it rong!” guy. Thanks for sharing it.

  11. Avatar
    Tal Rotbart Wed, 24 Jun 2009 03:36:57 GMT

    Without diving into patternitis, this sounds like a case for the Strategy pattern

    class Division 
    ...
    
      def process_invoice
        invoice_strategy.perform(self)
      end
    
    ...
    end
    
    With invoice_strategy being either:
    1. a simple attr_accessor method which contains an InvoicingStrategy instance that was chosen when you initialised the division constant, or
    2. a method which uses logic to decide which kind of invoicing strategy is required for that specific division (and/or even that request).

    This way the code for processing invoices by email is kept as one (testable) class while the code for processing invoices by rube-goldberg machine is kept separately as one (testable) class, etc.

  12. Avatar
    grosser Wed, 24 Jun 2009 05:42:13 GMT
    We got the same problem here, but resolved it using something like
    
        %w[foo bar foz].each{|name| define_method(name+'?'){ region == name }}
    
  13. Avatar
    Guoliang Cao Wed, 24 Jun 2009 12:36:31 GMT

    We are in similar situation here. In our application, we have to support several countries (US, CA, UK) and in many places, the behavior is slightly different. When those are initially implemented, we used if Locale.current.canada? to encapsulate the logic. Later I created a LocaleAware class and LogicForDefault, LogicForCanada classes. So I could use if LocaleAware.support_cpni? and have all canada specific logic in one place to look and change. This has worked well in many cases. There are still some cases we feel it is probably better to leave the “if country” there though.

  14. Avatar
    Rob Sanheim Wed, 24 Jun 2009 13:29:20 GMT

    I’m actually going to comment on the specific technique you talk about here, as opposed to the overall design. :)

    I’ve been burned in the past by defining top level constants in models that do ActiveRecord finds. The reason is that those finds get executed whenever the class gets loaded, instead of later on when the constant is actually needed. This means that your app ends up calling the database at times when you don’t expect it – for example when executing any rake task that happens to end up referring to Division.

    This can also bite you if you ever want to decouple your app more from the database, in order to use something like UnitRecord for example. Oh, it also means its really hard to stub or mock those values in tests as well (hello Object.const_set nastiness as opposed to Division.stubs(:usa) )

    I usually go right to class methods in approaches like this. Its just as clear, and its much more flexible – you can memoize it (or not), you can stub/mock like any other methods, and they don’t get loaded at class eval time.

  15. Avatar
    Geoff Buesing Wed, 24 Jun 2009 15:06:00 GMT

    I share Rob Sanheim’s concerns about loading models when the class gets loaded. Would be cleaner to just set the constants as the codes, like so:

    
    class Division < ActiveRecord::Base
      # country codes
      AFRICA = 'XYU238'
      ASIA = 'XIUHR73'
      ...
      # rules for who gets what feed
      WANTS_XML_FEED = [USA, CANADA]
      WANTS_CSV_FEED = [AUSTRALIA, NEW_ZEALAND]
    

    ...and then instance methods can check against these codes:

    
    def wants_xml_feed?
      WANTS_XML_FEED.include? code
    end
    
    def wants_csv_feed?
      WANTS_CSV_FEED.include? code
    end
    

    Controller methods then don’t have to contain rules about who gets what feed type, they just need to deliver as appropriate:

    
    def feed
      ...
      if division.wants_xml_feed?
        # deliver xml
      elsif divison.wants_csv_feed?
        # deliver csv
      else
       # send email
      end
    end
    
  16. Avatar
    Matt Wynne Sat, 11 Jul 2009 19:39:42 GMT

    This code, to me, is absolutely crying out for a little polymorphism. If there are only ten of these divisions, why even keep them in the database? Do their attributes ever need to be changed at run-time?

    Mightn’t it be easier to just have POROs like

    Division::Canada Division::UK Division::Africa

    etc and put the specific behaviour into each concrete class?

    I know what you mean about being able to see all the behaviour of each different division side-by-side, but this kind of conditional logic is soooooo prone to errors. See http://www.antiifcampaign.com/ if you want to learn more.

  17. Avatar
    Philip Orwig Sat, 11 Jul 2009 19:46:06 GMT

    Just be aware that this method won’t work with transactional fixtures unless you have them preloaded—ActiveSupport::TestCase loads model class when you make a call to “fixture”, and doesn’t populate the tables until right before running a test case.

  18. Avatar
    susan Wed, 10 Feb 2010 12:42:12 GMT

    Furthermore, although they are also used by the user to keep feet warm between discount ugg cardy boots waves catch should not be used to get into the waves. In fact, Ugg boots should be worn to be in other conditions of humidity, mud, rain, ice or mud. discount ugg boots To avoid unexpected weather damage Ugg, you should apply repellent thoroughly with the frequency prescribed. This will seal the sheep’s clothing, dirt and stains well. wholesale ugg boots The best product for this is Australia sheepskin UGG water and stain.

  19. Avatar
    ed hardy clothing Wed, 10 Mar 2010 07:09:57 GMT

    I can always get much useful information here. I hope I can know more information here. Many thanks.

  20. Avatar
    ed hardy clothing Wed, 10 Mar 2010 07:16:24 GMT

    Nice post. Hope to see more fresh ideas here. Thanks a lot.

  21. Avatar
    abercrombie clothes Wed, 10 Mar 2010 07:58:09 GMT

    thanks a lot for sharing and hope more

  22. Avatar
    pandora jewelry Wed, 17 Mar 2010 06:53:33 GMT

    nice post

  23. Avatar
    wholesale ed hardy Wed, 17 Mar 2010 07:21:50 GMT
  24. Avatar
    70-680 Thu, 15 Apr 2010 06:26:24 GMT

    There are some cases area we’re just accomplishing something arbitrary (like alteration archetype in a beam bulletin for one specific division, administration altered tax rates, etc.).

  25. Avatar
    70-685 Thu, 15 Apr 2010 06:26:48 GMT

    Your code, conceivably a few instance methods would go a continued way appear (even more) clear code?

  26. Avatar
    70-290 Thu, 15 Apr 2010 06:27:13 GMT

    Throughout the cipher base, you’ll acquisition business rules like this. Our developers all agreed that this was far from affable and/or able and affliction of all, it was acutely error-prone.

  27. Avatar
    MB6-818 Thu, 15 Apr 2010 06:27:51 GMT

    I capital to allotment something that we did to accomplish this easier for our aggregation to plan about these codes, which we should accept anticipation of continued ago.

  28. Avatar
    huabng Sun, 18 Apr 2010 08:08:01 GMT

    Again, estimates suggest that the numbers in both ICM and Com Res would make Labour the largest party but leave it short of an overall majority. Labour finds itself in the unusual position of falling to third place in three out of the last four polls but celebrating its potential return to government.

    The leaders debates have nfl jerseys changed the shape of British election campaigns, as those who warned the Tory soccer jerseys leader against demanding them said they would. First, there are the practicalities. Three days of any NBA jerseys campaign week are dominated by preparing,World Cup Jerseys debating, post-match spinning and then learning the lessons for the next encounter. On top of that the three NHL jerseys leaders have punishing schedules, criss-crossing the country.

  29. Avatar
    Hollywood Wallpapers Mon, 19 Apr 2010 01:25:14 GMT

    Really great

  30. Avatar
    nike shox Sat, 24 Apr 2010 02:49:40 GMT

    But perhaps it’s a bad suggestion if you won’t be adding any more region codes or if all region codes need different behaviour from the rest

  31. Avatar
    Christian louboutin shoes Mon, 10 May 2010 06:45:11 GMT
  32. Avatar
    laptop battery manufacturer Thu, 13 May 2010 06:44:18 GMT

    we have, Australia, United Kingdom, Canada, United States, and so forth.

  33. Avatar
    air jordan shoes Tue, 25 May 2010 07:57:10 GMT

    What about using ActiveSupport::StringInquirer to achieve something like “division.name.australia?” or “division.name.usa?”?

  34. Avatar
    air jordan 14 Mon, 31 May 2010 01:10:53 GMT

    treter

  35. Avatar
    Zoom Soldier 4 Tue, 01 Jun 2010 07:17:26 GMT

    tet ert

  36. Avatar
    Tevez 11 jerse Tue, 01 Jun 2010 07:17:52 GMT
  37. Avatar
    lebron v Wed, 02 Jun 2010 02:41:33 GMT

    YRTY TRY RT

  38. Avatar
    louis vuitton shorts Thu, 03 Jun 2010 01:15:34 GMT

    Beauteous white roses are blooming peacefully in the wizard’s secret garden. Someone could hear the voice of blooming whilst someone might see the sequel of fading. http://www.the-various.com/

  39. Avatar
    ebron soldier Fri, 04 Jun 2010 07:25:24 GMT

    RT RE T

  40. Avatar
    italy world cup jerseys Fri, 04 Jun 2010 07:25:48 GMT

    IUOUYI UY

  41. Avatar
    lebron v Fri, 04 Jun 2010 07:26:03 GMT

    67 67

  42. Avatar
    coach handbags Fri, 04 Jun 2010 13:45:19 GMT

    how to find the best coach handbags ? coach online store can make you feel safe , here you will find coach 14512 white and coach 14294 black with free shipping . low price coach handbags make people can able to buy and own beautiful coach 12963 .

  43. Avatar
    Simon Thu, 10 Jun 2010 02:03:24 GMT

    Here’s a different approach for a slightly different problem. In my case I just want replace code like this:

    booking.status == Booking.find_by_code('PENDING')

    with this code like this:

    booking.status_id = Booking::PENDING

    which feels a little faster and looks a little cleaner.

    Take a look here (example usage in the comments): http://gist.github.com/432459

    Interested in feedback (am noob-ish at rails).

  44. Avatar
    Simon Thu, 10 Jun 2010 02:04:17 GMT

    I meant == of course.

  45. Avatar
    designer handbags reviews Sat, 12 Jun 2010 03:55:50 GMT

    Why do you find yourself looking over the code to compare divisions? Could you write a tool to extract the ‘process_invoice’ someone suggested to display them all side-by-side?

  46. Avatar
    asdf Sat, 19 Jun 2010 01:27:41 GMT

    Why do you find yourselchi hair straightenerf looking over the code to compare divisions? Could you write a tool to extract the ‘process_invoice’ someone suggested to display them all side-by-side?

  47. Avatar
    designer handbags Thu, 24 Jun 2010 06:46:18 GMT

    Nice post,thank you for your sharing.http://www.handbags-club.com/

  48. Avatar
    dizi izle Mon, 28 Jun 2010 19:41:16 GMT

    Thanks. ...................

  49. Avatar
    hello Thu, 01 Jul 2010 06:19:18 GMT
  50. Avatar
    replica handbags Thu, 01 Jul 2010 06:33:51 GMT

    process_invoice’ someone suggested to display them all side-by-side?

  51. Avatar
    jordan shoes Thu, 01 Jul 2010 09:11:22 GMT

    The post is wonderful! Our companies supply the best lactose shoes, Men and women in Jordan shoes and nike shoes, our store many types of mbt shoes sale .Are you looking for your satisfied Nike Air Max? There is a large products selection of Nike Shoes. And you can try mbt shoes, which for your health is very helpful. You can find them only here, we can supply the best service for you.

  52. Avatar
    ed hardy Wed, 07 Jul 2010 06:55:37 GMT

    You know the most popular is Some people say that jewelry, cars, is not now popular all things fashion, for example, is Ed hardyNfl jerseys, many people like to buy it, like many Hollywood stars are, of course, shoes also be mentioned, that is, Adidas shoes, his popularity is no doubt, because it is the NBA star’s favorite, is our choice.

  53. Avatar
    chanel bag Wed, 07 Jul 2010 06:55:39 GMT

    Now, with the development of economy, people’s living standards improved, relative to the people’s consumption level, buying things, but also many women favorite clothes bag, but is now we’ll see those packages are popular, Chanel bag, The greengrocer ‘show’s Jimmy choo handbags, it is women’s favorite, but there is also a popular among ladies from that in order to buyPrada handbags, they can all these packages to splurge, so you don’t flex the charm, the answer is yes.

  54. Avatar
    nike air max 2009 Wed, 07 Jul 2010 11:10:38 GMT

    As scientific study show that a person’s life, not less than 1 third are situated in a various sports such as running and play basketball.As this, wearing a comfortable pair of air max shoes to exercise is significant.The my-nikeshoes.com online store have many kinds of nike max shoes,this nike air max shoes are all high quality but low price.If you a female,you may consider womens air max 2009,womens air max 2010,womens air max 90,womens air max classic BW,womens air max 95,womens air max ltd,womens air max 2012,womens air max 87,womens air max 97.If you are a kid,you can think out kids air max 90,kids air max classic BW,if you are a man,you can think over nike air max 180,nike air max 2009,nike air max 2010,nike air max 2012,nike air max 87,nike air max 90,nike air max 91,nike air max 93,nike air max 95,nike air max BW,nike air max ltd,nike air max TN,these nike air shoes are all breathable and durable.The most important thing is to wear comfortable, not to hurt the feet. Otherwise, if shoes aren’t appropriate, makers a foot in numerous respects, the impact of internal organs, affecting appetite, skin, and a number of other health challenges. air max 2009 nike and air max 90 nike are developed for tourism,sports activities footwear,its technical content within the footwear. Plus a foot inside the movement,will do lots of friction and contact,not the excellent footwear can conveniently affect the comfort of your feet.For that reason,in motion to wear a pair of comfy,scientific,suitable sports activities footwear,it’s rather incredibly fundamental. If you may possibly be a expert athlete, the system nike air max and acquire a perfect musculature.Actually, apart from as a trainer for running the boundary line of womens air max, who also has a taste of Fashion, or even enhance the functionality of style. The air max 2009 has made some major progress in terms of righting the air max. Although the classic Air Max models as air max 95,air max BW,air max 90 continue to sell, many of the newer designs have struggled to catch on. The air max tailwind 2010 and nike air max tailwind got off to a good start, impressing a lot of people with its sleek design and heavy use of Flywire technology. With its innovative lightweight construction and sleek look, the air max 2010 has definitely made the statement that there is plenty to still get excited about when it comes to the continuation of the air max nike legacy. The shoes still sports the same basic design, but the upper is simplified, using a mesh and leather upper with EVA outsole and tongue branding.nike kobe shoes, nike air max lebron vii shoes and nike lebron vii low shoes,nike air max lebron vii low shoes maintains a similar look to the prior versions by using a stitching pattern on the side of the upper that follows the same design as the crossed Flywire.kobe v shoes and nike lebron james vii PS shoes is the 2010 new designed specfically for LeBron’s second season,Inherited air max lebron vii shoes advantages, and added many new technologies.The nike lebron vii PS shoes is very best suit to play basketball.If you are a Lebron fan,buy lebron vii PS are your best choice.Welcome to visit our online store.

  55. Avatar
    Louis Vuitton Outlet Sun, 18 Jul 2010 12:16:26 GMT
  56. Avatar
    Cable Ties Mon, 19 Jul 2010 07:49:01 GMT

    Nice information, valuable and excellent design, as share good stuff with good ideas and concepts, lots of great information and inspiration, both of which we all need, thanks for all the enthusiasm to offer such helpful information here.

  57. Avatar
    louis vuitton Tue, 20 Jul 2010 06:30:41 GMT

    good

  58. Avatar
    banggood Sat, 24 Jul 2010 02:13:16 GMT

    In 1960, the world’s first partly automatic wholesale Cell phones system, Mobile System A (MTA), was launched in Sweden. MTA phones were composed of vacuum tubes and relays, and had a weight of 40 kg. In 1962, a more modern version called wholesale Cell phones System B (MTB) was launched, which was a push-button telephone, and which used transistors in order to enhance the telephone’s calling capacity and improve its operational reliability. In 1971 the MTD version was launched, opening for several different brands of wholesale Cell phones and gaining commercial success.

  59. Avatar
    textiles Sun, 25 Jul 2010 22:37:44 GMT

    i think its great work.

  60. Avatar
    medical billing Sun, 25 Jul 2010 22:38:26 GMT

    nice blog

  61. Avatar
    limo in baltimore Sun, 25 Jul 2010 22:38:49 GMT

    good wor,

  62. Avatar
    software solution Sun, 25 Jul 2010 22:39:25 GMT

    great work.

  63. Avatar
    music pakistan Sun, 25 Jul 2010 22:48:29 GMT

    nice work.

  64. Avatar
    six sigma process Sun, 25 Jul 2010 22:48:57 GMT

    great work

  65. Avatar
    Hermes Birkin Tue, 27 Jul 2010 04:39:20 GMT
  66. Avatar
    mbt Wed, 28 Jul 2010 07:23:19 GMT

    mbt shoes is better than common shoes, and MBT Habari Sandals help you keep healthy, many people get mbt discount with low price.

  67. Avatar
    kemi Fri, 30 Jul 2010 09:10:37 GMT

    Threats to tiffany replica jewelry reveal the fling came nearly replica tiffany jewelry six years after it took replica cartier place, Pitino said. On Feb. 26, bvlgari belt 2009, he listened to a omega seamaster planet ocean cell phone message of a swiss replica watch man’s voice describing details of tiffany cufflink the encounter at the restaurant juicy necklaces and calling it a violent louis vuitton suhali leather assault, Pitino told the jury.

  68. Avatar
    chanel jewelry Wed, 04 Aug 2010 07:29:54 GMT

    Mass., where replica chanel earrings the Bachelorette met his family,

  69. Avatar
    bag manufacturer Fri, 06 Aug 2010 03:35:27 GMT

    ecords, but each of them sits on top of an insanely large and complex set of data. Each record refers to a each of their regions that our client does busin

  70. Avatar
    iphone on sale Wed, 11 Aug 2010 02:23:30 GMT
  71. Avatar
    http://www.bestretroshoes.com Thu, 12 Aug 2010 05:59:47 GMT
    Jordan Flight 45,Jordan Flight 45
    Air Flight Condor Basketball,Air Flight Condor Basketball
    kid jordan shoes,kid jordan shoes
    jordan flight 9,jordan flight 9
    air jordan big size,air jordan big size
    jordan 25th anniversary,jordan 25th anniversary
    nike air force 1,nike air force 1
    Air jordan Fusion 17.5,Air jordan Fusion 17.5
    Air Jordan Fusion 14,Air Jordan Fusion 14
  72. Avatar
    ewe Fri, 20 Aug 2010 07:29:41 GMT

    www.reebok-easytone.com Reebok EasyTone Reeinspire easy tone SPRING GREEN 7.5 M Reebok EasyTone Reeinspire Pink Silve Reebok EasyTone Reeinspire White Blue Reebok EasyTone Rush Trainers WhitePurple Reebok EasyTone Toning Fitness Shoe for Women Reebok EasyTone Toning Fitness Shoe Electro for Women Reebok Women’s EasyTone Reebok Women’s EasyTone Reeinspire Lux Walking Shoe Reebok Women’s Reeinspire Walking Shoe – Orange Reebok Runner Running Athletic Shoes for Women White EasyTone Shape UPS shoes skechers shape ups fitness junkie skechers shape ups metabolize skechers shape ups sleek fit skechers shape ups strength skechers shape ups jump start MBT shoes MBT Changa MBT Chapa MBT Lami MBT M.Walk MBT New Arrival MBT Safiri MBT Shoes Sale MBT Sport MBT Tataga MBT Tembea Men’s MBT Shoes Women’s MBT MLB Jerseys Kid MLB Jerseys Anaheim Angels Jerseys Atlanta Braves Jerseys Boston Red Sox Jerseys Chicago Cubs Jerseys Chicago White Sox Jerseys Detroit Tigers Jerseys Minnesota Twins Jerseys New York Mets Jerseys Milwaukee Brewers Jerseys Philadelphia Phillies Jerseys New York Yankees Jerseys Pittsburgh Pirates Jerseys San Diego Padres Jerseys St.Louis Cardinals Jerseys Los Angeles Dodgers Jerseys Cleveland Indians Jerseys Rays Jerseys Cincinnati Reds Jerseys San Francisco Giants Jerseys Toronto Blue Jays Jerseys Orioles Jerseys MLB 2009 ALL STAR GAME JERSEYS

    NFL Jerseys 2010 Superbowl Jerseys 2010 Probowl Jerseys 2009 Pro Bowl Jerseys Women NFL Jerseys 2010 NFL 1st Round Draft Jerseys 2009 Super Bowl XLIII Jerseys Youth NFL Jerseys 2008 Pro Bowl Jerseys Arizona Cardinals Jerseys Atlanta Falcons Jerseys Baltimore Ravens Jerseys Buffalo Bills Jerseys Cincinnati Bengals Jerseys Cleveland Browns Jerseys Carolina Panthers Jerseys Chicago Bears Jerseys Denver Broncos Jerseys Dallas Cowboys Jerseys Detroit Lions Jerseys Green Bay Packers Jerseys Houston Texans Jerseys Indianapolis Colts Jerseys Kansas City Chiefs Jerseys Miami Dolphins Jerseys Minnesota Vikings Jerseys New England Patriots Jerseys New York Jets Jerseys New York Giants Jerseys New Orleans Saints Jerseys Oakland Raiders Jerseys Pittsburgh Steelers Jerseys Philadelphia Eagles Jerseys San Diego Chargers Jerseys San Francisco 49ers Jerseys Seattle Seahawks Jerseys St Louis Rams Jerseys Tennessee Titans Jerseys Tampa Bay Buccaneers Jerseys Washington Redskins Jerseys Houston Oiler Jerseys

    NFL Jackets NFL Cowboys Jacket NFL Giants Jacket

    NHL Jerseys 2010 OLYMPIC Canada Jerseys 09 All Star Jerseys Kids NHL Jerseys Montreal Canadiens Jerseys Chicago Blackhawks Jerseys Philadelphia Flyers Jerseys Detroit Red Wings Jerseys New Jersey Devils Jerseys Pittsburgh Penguins Jerseys Boston Bruins Jerseys Calgary Flames Jerseys Washington Capitals Jerseys Edmonton Oilers Jerseys San Jose Sharks Jerseys Los Angeles Kings Jerseys Toronto Maple Leafs Jerseys Vancouver Canucks Jerseys New York Rangers Jerseys Buffalo Sabres Jerseys Minnesota Wilds Jerseys Tampa Bay Lightning Jerseys Colorado Avalanche Jerseys Carolina Hurricanes Jerseys Phoenix Coyotes Jerseys Ottawa Senators Jerseys ST.LOUIS BLUES Jerseys New York Islanders Jerseys New york Jets Jerseys Columbus Blue Jackets

    NBA Jerseys 2009 NBA ALL STAR Jerseys 2008 olympic Basketball Jerseys North Carolina Jerseys Miami Heat Jerseys Atlanta Hawks Jerseys New York Knicks Jerseys Boston Celtics Jerseys Orlando Magic Jerseys Charlotte Bobcats Jerseys Philadelphia 76ers Jerseys Chicago Bulls Jerseys Washington Wizards Jerseys Cleveland Cavaliers Jerseys New Orleans Hornets Jerseys Denver Nuggets Jerseys Indiana Pacers Jerseys Detroit Pistons Jerseys Toronto Raptors Jerseys Los Angeles Lakers Jerseys Milwaukee Bucks Jerseys Minnesota Timberwolves Jerseys Dallas Mavericks Jerseys Houston Rockets Jerseys Phoenix Suns Jerseys Utah Jazz Jerseys Sacramento Kings Jerseys Memphis Grizzlies Jerseys San Antonio Spurs Jerseys Golden State Warriors Jerseys Seattle SuperSonics Jerseys(0) L.A. Clippers Jerseys Portland Trail Blazers Jerseys New Jersy Nets Jerseys

  73. Avatar
    Jack Wed, 25 Aug 2010 03:39:52 GMT
  74. Avatar
    Jack Wed, 25 Aug 2010 03:40:09 GMT
  75. Avatar
    gucci handbags Thu, 26 Aug 2010 07:21:16 GMT

    Gucci ‘Crystal Mix’ Medium Tote 223963 FZI4G 9795Gucci ‘Crystal Mix’ Small Tote 223964 FZI4G 9795Gucci ‘D Gold’ Medium Tote 211982 FFPAG 1000Gucci ‘D Gold’ Small Tote 189831 FFPAG 9643Gucci ‘G Wave’ Large Tote 232944 CTA2G 2727Gucci ‘G wave’ medium shoulder bag 232931 CTA2G 2727Gucci ‘GG twins’ medium hobo 232962 F4C7N 9769Gucci ‘Horsebit Tassel’ Medium Tote 232969 FWCHG 9791Gucci ‘Icon Bit’ Large Tote 232952 A7M0N 7604Gucci ‘icon bit’ medium shoulder bag 228584 A7M0R 9022Gucci ‘Icon Bit’ Medium Tote 229852 FWCGN 9767Gucci ‘Interlocking’ Medium Tote 223954 FWC4T 1000Gucci ‘Interlocking’ Medium Tote 223954 FWC4T 9762Gucci ‘Joy’ Medium Tote 197953 AH01G 2535Gucci ‘Joy’ Medium Tote 197953 FCIEG 8526Gucci ‘Joy’ Medium Tote 197953 FTQ4G 1193Gucci ‘Joy’ Medium Tote 197953 FU49N 8108Gucci ‘Jungle’ Large Tote 232942 BGD0N 1000Gucci ‘Jungle’ Large Tote 232942 BGD0N 1908Gucci ‘Ladies Web’ Medium Tote 211936 FTATG 9791Gucci ‘Match Ball’ Medium Tote 232970 FFKPN 9791Gucci ‘Metal Studs’ Medium Tote 229848 FU49R 1000Gucci ‘Metal Studs’ Medium Tote 229850 FU49R 1000Gucci ‘New Ladies Web’ Medium Tote 233607 F4CBG 9793Gucci ‘Sukey’ Large Tote 211943 AA61G 1000Gucci ‘Sukey’ Large Tote 211943 ECU9G 2140Gucci ‘Sukey’ Large Tote 211943 FAFXG 8526Gucci ‘Sukey’ Large Tote 211943 FAFXG 9769Gucci ‘Sukey’ Medium Tote 211944 AA61G 2019Gucci ‘Sukey’ Medium Tote 211944 AA61G 2535http://www.topguccistore.com/">gucci Outlet ★Gucci ‘Sukey’ Medium Tote 211944 AHB1N 8102Gucci ‘Sukey’ Medium Tote 211944 ECUDG 9560Gucci ‘Sukey’ Medium Tote 211944 FAFXG 8526Gucci ‘Sukey’ Medium Tote 211944 FAFXG 9761Gucci ‘Sukey’ Medium Tote 211944 FAFXG 9769Gucci ‘Sunset’ Large Tote 232943 FWCFN 8533Gucci ‘Sunset’ Medium Tote 232954 A261T 1200Gucci ‘Sunset’ Medium Tote 232954 F4G1T 9685Gucci ‘Sunset’ Medium Tote 232973 FSD1N 8469Gucci unset’ Medium Tote 232973 FWCFN 8533Gucci ‘Sunset’ Medium Tote 232973 FWCFN 9791Gucci ‘techno horsebit’ large hobo 240239 A7M0N 1000Gucci ‘techno horsebit’ medium hobo 240261 FWCGN 8655Gucci ‘techno horsebit’ medium hobo 240261 A7M0N 1211Gucci belt bag 28566R FV55G 8565Gucci briefcase 201480 FU49R 1000Gucci joy 193604 FVD1Z 9098Gucci ‘abbey’ medium messenger bag 131326 F4DYG 9643Gucci ‘abbey’ medium messenger bag 131326 AA61G 2019Gucci ‘babouska’ medium top handle bag 207285 A3Y3Z 2140Gucci ‘babouska’ medium top handle bag 207285 FT0PZ 9643Gucci ‘hysteria’ large tote 197022 BCB1G 1000Gucci ‘jockey’ medium tote 203546 AHB1T 9640Gucci ‘jockey’ medium tote 203546 FTAQT 9643Gucci ‘sukey’ large tote 211943 F4C2G 9721Gucci handbag 113757Gucci handbag 181082—-9643Gucci handbag 223668 FCIEZ 9076Gucci handbag 229852 AA61R 9022Gucci handbag 232970 FFKPN 8429Gucci handbag 240236 A7M0N 1000Gucci handbag 240236 FWCGNGucci handbag 240236 FWCGN 8655Gucci handbag 240236 A7M0N 9014Gucci handbag 240237 A7M0N 9014Gucci handbag 240239 EIM1N 1000Gucci handbag 240241 A7M0N 9014Gucci handbag 240241 FWCGN 8655Gucci handbag 240241 BGG0N 1211http://www.topguccistore.com/">gucci Outlet ★Gucci handbag 240242 FWCGN 8655Gucci handbag 240242 FWCGN WHITEGucci handbag 240261 AF51N 9014Gucci handbag 240261 FPO1N 1000Gucci handbag 240261 CLASSICSGucci handbag 240261 FWCGN 8708Gucci handbag 240261 FWCWN 9786Gucci handbag 240261 AF51N 4207Gucci handbag 240266 A7MON WHITEGucci handbag 240266 FWCGN WHITEGucci handbag 240266 FWCGN 8655Gucci handbag 240266 FWCGN 9022Gucci handbag 240266 FWCGN 1000Gucci handbag 241097 FPO1N WHITEGucci hysteria 211843 FT0FS 4060Gucci jolie 211975 FAF4X 1000Gucci joy 197953 FT0CG 6845Gucci joy 197953 AH01G 6807Gucci joy 197953 FVD1Z 9098Gucci medium tote 153033 FFK2G 9783Gucci medium tote 153033 FFK2G whiteGucci medium tote 201482 FP1ZG 9756Gucci sukey 211944 AA61G 9815Gucci sukey 211944 FVEHG 9769Gucci tote 189680 BEC0N 1000Gucci tote 211101 BEC0N 1000Guuci ‘babouska’ medium tote 208940 FT0PZ 9643Gucci large messenger bag 201725 FU4CR 1000Gucci medium messenger bag 181092 FV55G 8565Gucci medium tote 189669 FV55G 8565Gucci medium tote 131230 FV55G 8565Gucci medium tote 211137 FCIEG 9076Gucci medium tote 211137 FU49N 9066Gucci medium tote 233081 FP44G 9080Gucci messenger bag 211107 FU4CR 1000Gucci small messenger bag 223666 FCIEK 9761Gucci small messenger bag 223666 FCIEG 9076Gucci small messenger bag 223666 FCIGG 8588Gucci small tote 211138 FCIEG 9076Gucci small tote with signature web loop 211135 FP44G 9080Gucci tote 223668 FCIEK 9761Gucci tote 223668 FCIEG 9643Gucci tote 223668 FCIEZ 9076http://www.topguccistore.com/">gucci Outlet ★Gucci ‘D gold’ large hobo with 189833 AHB1G 8236Gucci ‘D gold’ large hobo with 189833 FTQ3G 8065Gucci ‘D gold’ medium hobo with 190525 FTQ3G 8065Gucci ‘jockey’ medium hobo 211966 AHB1T 9640Gucci babouska 207300 FT0QZ 9643Gucci hysteria 197061 AA61G 2019Gucci jockey 203542 FTAQT 1000Gucci jockey 203542 FTAQT 9643http://www.topguccistore.com/">gucci Outlet ★Gucci ‘Charlotte’ Medium Hobo 211810 FFP5G 1000Gucci ‘Charlotte’ Medium Hobo 211810 FFP5G 9643Gucci ‘Crystal Mix’ Medium Hobo 223965 FZI4G 9795Gucci ‘D Gold’ Large Hobo 189833 FFPAG 1000Gucci ‘D Gold’ Large Hobo 189833 AA61G 2019Gucci ‘D Gold’ Large Hobo 189833 AA61G 1000Gucci ‘D Gold’ Large Hobo 189833 FFPAG 9643Gucci ‘D Gold’ Large Shoulder Bag 189835 FFPAG 9643Gucci ‘D Gold’ Medium Hobo 190525 FFPAG 9643Gucci ‘G Coin’ Large Boston Bag 232934 A7M0N 1000Gucci ‘G Coin’ Large Boston Bag 232934 A7M0N 9014Gucci ‘G Wave’ Medium Shoulder Bag 232931 CTA2G 1000Gucci ‘G Wave’ Medium Shoulder Bag 232931 CTA2G 1508Gucci ‘G Wave’ Medium Shoulder Bag 232931 ECURG 2727Gucci ‘Galaxy’ Medium Shoulder Bag 228560 BFG2X 1000Gucci ‘GG Twins’ Medium Hobo 232962 AA61N 1000Gucci ‘GG Twins’ Medium Hobo 232962 F4C7N 9761Gucci ‘Horsebit Tassel’ Medium Hobo 232968 FWCHG 9791Gucci ‘Icon Bit’ Large Boston Bag 228585 A7M0R 1000Gucci ‘Icon Bit’ Large Hobo 232950 A7M0N 7620Gucci ‘Icon Bit’ Medium Boston Bag 228594 A7M0R 1000Gucci ‘Icon Bit’ Medium Boston Bag 228594 A7M0R 9022Gucci ‘Icon Bit’ Medium Hobo 232961 FWCGN 9767Gucci ‘Icon Bit’ Medium Shoulder Bag 228584 A7M0R 1000Gucci ‘Icon Bit’ Medium Shoulder Bag 228584 AA61N 7620Gucci ‘Icon Bit’ Medium Shoulder Bag 228584 ECU6R 1000Gucci ‘Icon Bit’ Medium Shoulder Bag 228584 EL50R 1000Gucci ‘Interlocking Icon’ Medium Shoulder Bag 223951 AE91T 1000Gucci ‘Interlocking Icon’ Medium Shoulder Bag 223951 CFC1T 2140Gucci ‘Interlocking’ Medium Hobo 223952 FWC4T 1000Gucci ‘Interlocking’ Medium Hobo 223952 FWC4T 8583Gucci ‘Interlocking’ Medium Hobo 223952 FWC4T 9762Gucci ‘Joy’ Medium Shoulder Bag 203494 AH01G 1000Gucci ‘Joy’ Medium Shoulder Bag 203494 AH01G 2535Gucci ‘Joy’ Medium Shoulder Bag 203494 FCIEG 8526Gucci ‘Jungle’ Large Shoulder Bag 232940 BGD0N 1000Gucci ‘Jungle’ Large Shoulder Bag 232940 BGD0N 1908Gucci ‘Jungle’ Medium Hobo 232930 BGD0N 1000Gucci ‘Jungle’ Medium Hobo 232930 BGD0N 1908Gucci ‘Ladies Web’ Medium Hobo 211934 BEG1G 1000Gucci ‘Ladies Web’ Medium Hobo 211934 BEG1G 9022Gucci ‘new jackie’ large shoulder 219704 BCC8G 3611Gucci ‘New Jackie’ Large Shoulder Bag 218491 A261G 1200Gucci ‘New Jackie’ Large Shoulder Bag 218491 A261G 2703Gucci ‘New Jackie’ Large Shoulder Bag 218491 A261G 7604Gucci ‘New Jackie’ Large Shoulder Bag 218491 A2O0G 1200Gucci ‘New Jackie’ Large Shoulder Bag 218491 A2O0G 7620Gucci ‘New Jackie’ Large Shoulder Bag 218491 CD11G 8418Gucci ‘New Jackie’ Large Shoulder Bag 218491 CH0VG 1267Gucci ‘New Jackie’ Large Shoulder Bag 218491 EG91G 3069Gucci ‘New Jackie’ Large Shoulder Bag 218491 EJ50G 7620Gucci ‘New Jackie’ Large Shoulder Bag 218491 F4G1G 9776Gucci ‘New Jackie’ Large Shoulder Bag 218491 FSD1G 8469Gucci ‘New Jackie’ Large Shoulder Bag 223929 CTA0G 1000Gucci ‘New Jackie’ Large Shoulder Bag 223929 CTC0G 3003Gucci ‘New Jackie’ Medium Shoulder Bag 219725 CTA0G 2145Gucci ‘New Ladies Web’ Medium Hobo 233608 BER2G 1000Gucci ‘New Ladies Web’ Medium Hobo 233608 F4CBG 9793Gucci ‘New Pelham’ Large Shoulder Bag 223955 A2O0T 2703Gucci ‘New Pelham’ Large Shoulder Bag 223955 A2O0T 7620Gucci ‘New Pelham’ Large Shoulder Bag 223955 F4G1T 9780Gucci ‘New Pelham’ Large Shoulder Bag 223958 A261T 2033Gucci ‘New Pelham’ Large Shoulder Bag 223958 A2O0T 1200Gucci ‘New Pelham’ Large Shoulder Bag 223958 A2O0T 2703Gucci ‘New Pelham’ Large Shoulder Bag 223958 F4G1T 9685Gucci ‘New Pelham’ Large Shoulder Bag 223958 F4G1T 9780Gucci ‘Pelham’ Medium Hobo 211986 FAF3G 1000Gucci ‘Pelham’ Medium Hobo 211986 FAF3G 9643

  76. Avatar
    Moncler Fri, 27 Aug 2010 17:09:49 GMT

    This article is to my feelings, thanks for your sharing, hoping to see more useful content, refueling,We are a Chinese supplier, we provide the best bag bag and clothes,ghd Moncler clothing P90x Abercrombie clothes Moncler Jackets

  77. Avatar
    Christian Louboutin Mon, 30 Aug 2010 09:32:36 GMT

    Christian Louboutin experimental art and design styles in shoe manufacturing is a maverick. Embellishment on the shoes of those well-designed small-pattern often gives people a great surprise, such as a bright red sweetheart, a pink feathers, delicate and charming flower buds. Charmingly, Christian Louboutin Wedges enjoy great part of the market place and huge popularity among consumers. Find discount Christian Louboutin at Christian Louboutin.

  78. Avatar
    MBT Tue, 31 Aug 2010 06:55:02 GMT
  79. Avatar
    discount ugg boots Thu, 02 Sep 2010 12:00:25 GMT
  80. Avatar
    discount ugg boots Thu, 02 Sep 2010 12:00:28 GMT

Share your thoughts... (really...I want to hear them)

Comments