SlideShare una empresa de Scribd logo
1 de 17
Descargar para leer sin conexión
Commit.where.not(liked_by: ‘DHH’).reject!




A story about open source, ideas, smells and tastes
               [github.com/claudiob]

 I’m a Senior Software Engineer at GOOD and I’m going to to tell you a story about what I learned from contributing to Rails.
TL;DR
Rails 3    Commit.where(“liked_by <> ‘DHH’”)



Rails 4     Commit.where.not(liked_by: ‘DHH’)

          So since this is a story, I’m going to spoil it and tell you how it ends.
          In Rails 3, ActiveRecord cannot specify negative conditions in a query, so you have to use SQL operators.
          In Rails 4, ‘where’ becomes a chainable method that can be followed by a new not operator to write a negation
Now that you know the end of the story, let’s rewind to its inception.

Most people don’t listen when you say something is annoying, even more if you are a stranger.
But programmers can be more heartful and kind than normal people.
We actually listen to complaints, even when they come from strangers. We empathize!
Commit.where(:liked_by ^ ‘DHH’)

Someone else had a similar feeling and created a gem to avoid SQL fragments.
What’s cool about gems is that you decide if you want to use them or not.
But suggesting this syntax in Rails core… gets rejected: it doesn’t smell or taste right.
DHH may sound harsh but he is telling the truth.
He is inviting us to try harder, to make a better coding world for everyone.

This is the main reason I love open source, because you can follow your instincts and feel human again!
Commit.where_not_like(sha: ‘2F%’)

So a new option came up: introducing where_not.
Well then, why not where_like, where_not_like, where_union etc?
But this would pollute ActiveRecord, a lot!
Commit.where.not(liked_by: ‘DHH’)

                                                                                Commit.where.like(author: ‘cla%’)

Finally, the best idea arrives: keept only one ‘where’ and make it chainable.
Rails 3                                                    where(“author <> ‘DHH’”)

@de75af7 where.not(author: ‘DHH’)

                                                            where.not(‘author = “DHH”’)

                                                            where.not(‘author = ?’, ‘DHH’)

 Rails 3                                                    where(“author like ‘DH%’”)

@de75af7 where.like(author: ‘DH%’)

 Rails 3                                                    where(“author not like ‘DH%’”)

@de75af7 where.not_like(author: ‘DH%’)
 Initially implemented by @amatsuda. Smells almost right…
Rails 3                                                                                               where(“id <> 42”).order(:id)

@de75af7 where.not(id: 42).order(:id)




 …but here’s a gotcha. Using mixins does not smell right.
 Mixins delegate the responsibility to another module instead of making sure the code does what we want.
 And you can write “smelly code” like the where.order(…).not(…) statement.
Rails 3                                                                                               where(“id <> 42”).order(:id)

@de75af7 where.not(id: 42).order(:id)

                                                                                                           where.order(:id).not(id: 42)




 …but here’s a gotcha. Using mixins does not smell right.
 Mixins delegate the responsibility to another module instead of making sure the code does what we want.
 And you can write “smelly code” like the where.order(…).not(…) statement.
So I made a pull request to use a builder class rather than a module.
Rails 3                                                                        where(“id <> 42”)

@de75af7 where.not(id: 42)

 Rails 3                                                                        where(“id > 42”)

                         ???                                                    where.gt(id: 42)

                         ???                                                    where.greater_than(id: 42)

 Rails 3                                                                        where(“id <= 42”)

                         ???                                                    where.lte(id: 42)

                         ???                                                    where.less_than_or_equal(id: 42)
  Moreover, if we start adding inequalities, than why not adding ALL of them?
Sounds right, but it’s not powerful enough, because they only apply to numeric types, while not has more uses.

Funny how a discussion started with “all SQL fragments are annoying” and took us to really understand their power one by one.
Rails 3                                                                                                                                                                         where(“author <> ‘DHH’”)

@de75af7 where.not(author: ‘DHH’)

                                                                                                                                                                                 where.not(‘author = “DHH”’)

                                                                                                                                                                                 where.not(‘author = ?’, ‘DHH’)

 Rails 3                                                                                                                                                                         where(“author like ‘DH%’”)

@de75af7 where.like(author: ‘DH%’)

 Rails 3                                                                                                                                                                         where(“author not like ‘DH%’”)

@de75af7 where.not_like(author: ‘DH%’)
  Which brings us back to evaluate this commit: in this light, where.like and where.not_like look very similar to inequalities: only apply to strings, do not reduce the code.
Rails 3                                                                                                                                                                         where(“author <> ‘DHH’”)

@de75af7 where.not(author: ‘DHH’)

                                                                                                                                                                                 where.not(‘author = “DHH”’)

                                                                                                                                                                                 where.not(‘author = ?’, ‘DHH’)

 Rails 3                                                                                                                                                                         where(“author like ‘DH%’”)

@de75af7 where.like(author: ‘DH%’)

 Rails 3                                                                                                                                                                         where(“author not like ‘DH%’”)

@de75af7 where.not_like(author: ‘DH%’)
  Which brings us back to evaluate this commit: in this light, where.like and where.not_like look very similar to inequalities: only apply to strings, do not reduce the code.
Therefore, not powerful enough to belong to the core!
TL;DR
Rails 3                                                                                                                                                                                                                                     Commit.where(“liked_by <> ‘DHH’”)



Rails 4                                                                                                                                                                                                                                     Commit.where.not(liked_by: ‘DHH’)


In the end, Rails 4 will have where chainable only with .not.

Contributing to Rails is fun, you learn a lot from the process, not only about source code, but about communities and the impact you can make following your instincts and listening to people who express feelings like “being annoyed”.
So, join the movement and contribute to open source!

Más contenido relacionado

Similar a The pleasure and learning process of contributing to Ruby on Rails

Redis Indices (#RedisTLV)
Redis Indices (#RedisTLV)Redis Indices (#RedisTLV)
Redis Indices (#RedisTLV)Itamar Haber
 
Elegant CSS Design In Drupal: LESS vs Sass
Elegant CSS Design In Drupal: LESS vs SassElegant CSS Design In Drupal: LESS vs Sass
Elegant CSS Design In Drupal: LESS vs SassMediacurrent
 
Transformational Tricks for RDF.pptx
Transformational Tricks for RDF.pptxTransformational Tricks for RDF.pptx
Transformational Tricks for RDF.pptxKurt Cagle
 
Prototype Utility Methods(1)
Prototype Utility Methods(1)Prototype Utility Methods(1)
Prototype Utility Methods(1)mussawir20
 
Ruby On Rails Introduction
Ruby On Rails IntroductionRuby On Rails Introduction
Ruby On Rails IntroductionThomas Fuchs
 
Ruby from zero to hero
Ruby from zero to heroRuby from zero to hero
Ruby from zero to heroDiego Lemos
 
Introduction to Perl
Introduction to PerlIntroduction to Perl
Introduction to Perlworr1244
 
php&mysql with Ethical Hacking
php&mysql with Ethical Hackingphp&mysql with Ethical Hacking
php&mysql with Ethical HackingBCET
 
Hijacking Ruby Syntax in Ruby (RubyConf 2018)
Hijacking Ruby Syntax in Ruby (RubyConf 2018)Hijacking Ruby Syntax in Ruby (RubyConf 2018)
Hijacking Ruby Syntax in Ruby (RubyConf 2018)SATOSHI TAGOMORI
 

Similar a The pleasure and learning process of contributing to Ruby on Rails (12)

Redis Indices (#RedisTLV)
Redis Indices (#RedisTLV)Redis Indices (#RedisTLV)
Redis Indices (#RedisTLV)
 
Rest in Rails
Rest in RailsRest in Rails
Rest in Rails
 
Elegant CSS Design In Drupal: LESS vs Sass
Elegant CSS Design In Drupal: LESS vs SassElegant CSS Design In Drupal: LESS vs Sass
Elegant CSS Design In Drupal: LESS vs Sass
 
Low-Maintenance Perl
Low-Maintenance PerlLow-Maintenance Perl
Low-Maintenance Perl
 
Transformational Tricks for RDF.pptx
Transformational Tricks for RDF.pptxTransformational Tricks for RDF.pptx
Transformational Tricks for RDF.pptx
 
Prototype Utility Methods(1)
Prototype Utility Methods(1)Prototype Utility Methods(1)
Prototype Utility Methods(1)
 
Ruby On Rails Introduction
Ruby On Rails IntroductionRuby On Rails Introduction
Ruby On Rails Introduction
 
Ruby from zero to hero
Ruby from zero to heroRuby from zero to hero
Ruby from zero to hero
 
Introduction to Perl
Introduction to PerlIntroduction to Perl
Introduction to Perl
 
SEO for Developers
SEO for DevelopersSEO for Developers
SEO for Developers
 
php&mysql with Ethical Hacking
php&mysql with Ethical Hackingphp&mysql with Ethical Hacking
php&mysql with Ethical Hacking
 
Hijacking Ruby Syntax in Ruby (RubyConf 2018)
Hijacking Ruby Syntax in Ruby (RubyConf 2018)Hijacking Ruby Syntax in Ruby (RubyConf 2018)
Hijacking Ruby Syntax in Ruby (RubyConf 2018)
 

Último

2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...Martijn de Jong
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...Neo4j
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Enterprise Knowledge
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherRemote DBA Services
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdfhans926745
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...apidays
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...apidays
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processorsdebabhi2
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityPrincipled Technologies
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century educationjfdjdjcjdnsjd
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Miguel Araújo
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptxHampshireHUG
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)Gabriella Davis
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024The Digital Insurer
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonAnna Loughnan Colquhoun
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Scriptwesley chun
 
Advantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessAdvantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessPixlogix Infotech
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 

Último (20)

2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
Advantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessAdvantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your Business
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 

The pleasure and learning process of contributing to Ruby on Rails

  • 1. Commit.where.not(liked_by: ‘DHH’).reject! A story about open source, ideas, smells and tastes [github.com/claudiob] I’m a Senior Software Engineer at GOOD and I’m going to to tell you a story about what I learned from contributing to Rails.
  • 2. TL;DR Rails 3 Commit.where(“liked_by <> ‘DHH’”) Rails 4 Commit.where.not(liked_by: ‘DHH’) So since this is a story, I’m going to spoil it and tell you how it ends. In Rails 3, ActiveRecord cannot specify negative conditions in a query, so you have to use SQL operators. In Rails 4, ‘where’ becomes a chainable method that can be followed by a new not operator to write a negation
  • 3. Now that you know the end of the story, let’s rewind to its inception. Most people don’t listen when you say something is annoying, even more if you are a stranger. But programmers can be more heartful and kind than normal people. We actually listen to complaints, even when they come from strangers. We empathize!
  • 4. Commit.where(:liked_by ^ ‘DHH’) Someone else had a similar feeling and created a gem to avoid SQL fragments. What’s cool about gems is that you decide if you want to use them or not.
  • 5. But suggesting this syntax in Rails core… gets rejected: it doesn’t smell or taste right. DHH may sound harsh but he is telling the truth. He is inviting us to try harder, to make a better coding world for everyone. This is the main reason I love open source, because you can follow your instincts and feel human again!
  • 6. Commit.where_not_like(sha: ‘2F%’) So a new option came up: introducing where_not. Well then, why not where_like, where_not_like, where_union etc? But this would pollute ActiveRecord, a lot!
  • 7. Commit.where.not(liked_by: ‘DHH’) Commit.where.like(author: ‘cla%’) Finally, the best idea arrives: keept only one ‘where’ and make it chainable.
  • 8. Rails 3 where(“author <> ‘DHH’”) @de75af7 where.not(author: ‘DHH’) where.not(‘author = “DHH”’) where.not(‘author = ?’, ‘DHH’) Rails 3 where(“author like ‘DH%’”) @de75af7 where.like(author: ‘DH%’) Rails 3 where(“author not like ‘DH%’”) @de75af7 where.not_like(author: ‘DH%’) Initially implemented by @amatsuda. Smells almost right…
  • 9. Rails 3 where(“id <> 42”).order(:id) @de75af7 where.not(id: 42).order(:id) …but here’s a gotcha. Using mixins does not smell right. Mixins delegate the responsibility to another module instead of making sure the code does what we want. And you can write “smelly code” like the where.order(…).not(…) statement.
  • 10. Rails 3 where(“id <> 42”).order(:id) @de75af7 where.not(id: 42).order(:id) where.order(:id).not(id: 42) …but here’s a gotcha. Using mixins does not smell right. Mixins delegate the responsibility to another module instead of making sure the code does what we want. And you can write “smelly code” like the where.order(…).not(…) statement.
  • 11. So I made a pull request to use a builder class rather than a module.
  • 12. Rails 3 where(“id <> 42”) @de75af7 where.not(id: 42) Rails 3 where(“id > 42”) ??? where.gt(id: 42) ??? where.greater_than(id: 42) Rails 3 where(“id <= 42”) ??? where.lte(id: 42) ??? where.less_than_or_equal(id: 42) Moreover, if we start adding inequalities, than why not adding ALL of them?
  • 13. Sounds right, but it’s not powerful enough, because they only apply to numeric types, while not has more uses. Funny how a discussion started with “all SQL fragments are annoying” and took us to really understand their power one by one.
  • 14. Rails 3 where(“author <> ‘DHH’”) @de75af7 where.not(author: ‘DHH’) where.not(‘author = “DHH”’) where.not(‘author = ?’, ‘DHH’) Rails 3 where(“author like ‘DH%’”) @de75af7 where.like(author: ‘DH%’) Rails 3 where(“author not like ‘DH%’”) @de75af7 where.not_like(author: ‘DH%’) Which brings us back to evaluate this commit: in this light, where.like and where.not_like look very similar to inequalities: only apply to strings, do not reduce the code.
  • 15. Rails 3 where(“author <> ‘DHH’”) @de75af7 where.not(author: ‘DHH’) where.not(‘author = “DHH”’) where.not(‘author = ?’, ‘DHH’) Rails 3 where(“author like ‘DH%’”) @de75af7 where.like(author: ‘DH%’) Rails 3 where(“author not like ‘DH%’”) @de75af7 where.not_like(author: ‘DH%’) Which brings us back to evaluate this commit: in this light, where.like and where.not_like look very similar to inequalities: only apply to strings, do not reduce the code.
  • 16. Therefore, not powerful enough to belong to the core!
  • 17. TL;DR Rails 3 Commit.where(“liked_by <> ‘DHH’”) Rails 4 Commit.where.not(liked_by: ‘DHH’) In the end, Rails 4 will have where chainable only with .not. Contributing to Rails is fun, you learn a lot from the process, not only about source code, but about communities and the impact you can make following your instincts and listening to people who express feelings like “being annoyed”. So, join the movement and contribute to open source!