From 3bca4e1d8757949456010ce3b79a2a5d685940b5 Mon Sep 17 00:00:00 2001 From: Syed Mohd Mehndi Date: Mon, 13 Nov 2023 14:36:44 +0530 Subject: [PATCH 1/2] Benefits of using polymorphic association in ruby on rails --- ...-rails-polymorphic-association-benefits.md | 121 ++++++++++++++++++ .../2023/11/polymorphic-association.png | Bin 0 -> 65925 bytes 2 files changed, 121 insertions(+) create mode 100644 content/blog/ruby-on-rails-polymorphic-association-benefits.md create mode 100644 static/images/2023/11/polymorphic-association.png diff --git a/content/blog/ruby-on-rails-polymorphic-association-benefits.md b/content/blog/ruby-on-rails-polymorphic-association-benefits.md new file mode 100644 index 000000000..f00d00fca --- /dev/null +++ b/content/blog/ruby-on-rails-polymorphic-association-benefits.md @@ -0,0 +1,121 @@ ++++ +title = "Unveiling the Benefits of Polymorphic Association in Ruby on Rails" +slug = "ruby-on-rails-polymorphic-association-benefits" +date = 2023-11-13T02:00:29+05:30 +image = "/images/2023/11/polymorphic-association.png" +draft = false +authors = ["Syed Mohd Mehndi", "Bhavesh Choudhary"] +description = "Unveiling the Benefits of Polymorphic Association in Ruby on Rails" +tags = ["Software Craftsmanship", "Ruby on Rails", "Polymorphic", "Code Reuse", "Decoupling"] +categories = ["Software Craftsmanship", "Ruby on Rails", "Polymorphic", "Code Reuse", "Decoupling"] +type = "" ++++ + +In the ever-evolving landscape of web development, optimizing database design and ensuring efficient data management are crucial aspects. Ruby on Rails, a popular web application framework, provides a powerful feature known as polymorphic association, which offers a myriad of benefits for developers. + +In this blog post, we'll explore the advantages of leveraging polymorphic association in Ruby on Rails. + +## 1. Storage Saving + +One of the key advantages of using polymorphic association is the efficient use of storage. Unlike traditional methods where blank columns might be created for existing records, polymorphic association allows data to be added to a dedicated table, avoiding the creation of unnecessary columns. + +This not only saves storage space but also ensures a cleaner and more organized database structure. + +## 2. Architectural Separation + +Polymorphic association enables architectural separation by allowing developers to track specific functionality in a different table without impacting the main table responsible for holding core data. + +This separation proves invaluable when dealing with functionalities that sync with other systems. Developers can create similar tables for different sync functionalities, maintaining a clear and modular architectural design. + +## 3. Flexibility + +Flexibility is a hallmark of polymorphic association. With a dedicated table for a specific functionality, such as tracking errors, developers have the freedom to add more columns like `last_error`, `error_code`, and others without impacting the main table. + +This flexibility ensures that the database schema can adapt to changing requirements without the need for extensive modifications. + +## 4. Better Indexing + +Maintaining optimal performance is crucial for any application, and polymorphic association aids in achieving better indexing. Adding numerous indexes to a single table can lead to performance degradation. + +By separating functionality into dedicated tables, developers can create indexes tailored to specific needs without impacting the performance of the main table. This approach contributes to a more efficient and responsive application. + +## 5. Easy Attachability + +Enabling functionality for multiple models becomes a seamless process with polymorphic association. In the case of our example, where functionality is enabled for three models, additional models can adopt the same functionality without requiring any database changes. + +Simply including the relevant module in the specific model is all that's needed, providing a hassle-free approach to extending functionality across different parts of the application. + +## 6. Avoiding Code Duplication + +The ease of attaching functionality to different models not only simplifies the development process but also helps in avoiding code duplication. + +As mentioned in point number 5, incorporating a module for a specific functionality ensures that the same codebase can be reused across various models, promoting cleaner and more maintainable code. + +--- + +## Illustrating Polymorphic Association with AWS Synchronization + +Let's integrate a real-world example of polymorphic association for tracking AWS synchronization for two distinct models: `Patient` and `Doctor`. + +```ruby +# app/models/aws_sync_status.rb +class AwsSyncStatus < ApplicationRecord + belongs_to :parent, polymorphic: true +end + +# == Schema Information +# +# Table name: aws_sync_statuses +# +# id :uuid not null, primary key +# parent_type :string not null +# synced_at :datetime +# triggered_at :datetime not null +# created_at :datetime not null +# updated_at :datetime not null +# parent_id :uuid not null +# +# Indexes +# +# index_aws_sync_statuses_on_parent (parent_type,parent_id) +# + +# app/models/concerns/aws/sync_track.rb +module Aws::SyncTrack + extend ActiveSupport::Concern + + included do + has_one :aws_sync_status, as: :parent, dependent: :destroy + delegate :synced_at, to: :aws_sync_status, prefix: :aws, allow_nil: true + end + + def synced_with_aws_at + return nil if aws_record_id.blank? + aws_synced_at || created_at + end + + def create_or_update_aws_sync_status(aws_sync_attrs) + aws_sync_status.blank? ? create_aws_sync_status(aws_sync_attrs) : aws_sync_status.update(aws_sync_attrs) + end +end + +# app/models/patient.rb +class Patient < ApplicationRecord + include Aws::SyncTrack +end + +# app/models/doctor.rb +class Doctor < ApplicationRecord + include Aws::SyncTrack +end +``` +In this example, we've implemented a polymorphic association using the AwsSyncStatus model. The Aws::SyncTrack concern is included in both the Patient and Doctor models, providing them with AWS synchronization tracking capabilities. + +This modularity allows for easy attachment of the AWS synchronization functionality to multiple models without the need for extensive database modifications. + +By utilizing polymorphic associations in this manner, developers can seamlessly extend functionality across various models, promoting a clean and modular approach to application development. + +## Conclusion +Polymorphic association in Ruby on Rails emerges as a valuable tool for database management and application architecture. From storage savings and architectural separation to flexibility and better indexing, the benefits of adopting polymorphic association are diverse and impactful. + +By incorporating this feature into your Rails projects, you can enhance both the efficiency and maintainability of your application's database design. The real-world example of AWS synchronization illustrates how polymorphic association facilitates the easy integration of specific functionalities across different models, showcasing the power and flexibility it brings to web development. \ No newline at end of file diff --git a/static/images/2023/11/polymorphic-association.png b/static/images/2023/11/polymorphic-association.png new file mode 100644 index 0000000000000000000000000000000000000000..b07987df22632b29eb8b86820c7ce0e27d7ab946 GIT binary patch literal 65925 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�zEX}qS;UQEu&khxqlDZj7dO9MNI)C1=D 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%0DIBLHhc$gz#sc?ZnI0xF%59DIh#Mx?yL5zo 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 Date: Mon, 13 Nov 2023 15:12:15 +0530 Subject: [PATCH 2/2] fix: formatting and newlines --- ...-rails-polymorphic-association-benefits.md | 32 +++++++++++++------ 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/content/blog/ruby-on-rails-polymorphic-association-benefits.md b/content/blog/ruby-on-rails-polymorphic-association-benefits.md index f00d00fca..9dce1aa46 100644 --- a/content/blog/ruby-on-rails-polymorphic-association-benefits.md +++ b/content/blog/ruby-on-rails-polymorphic-association-benefits.md @@ -11,13 +11,15 @@ categories = ["Software Craftsmanship", "Ruby on Rails", "Polymorphic", "Code Re type = "" +++ -In the ever-evolving landscape of web development, optimizing database design and ensuring efficient data management are crucial aspects. Ruby on Rails, a popular web application framework, provides a powerful feature known as polymorphic association, which offers a myriad of benefits for developers. +In the ever-evolving landscape of web development, optimizing database design and ensuring efficient data management are crucial aspects. +Ruby on Rails, a popular web application framework, provides a powerful feature known as polymorphic association, which offers a myriad of benefits for developers. In this blog post, we'll explore the advantages of leveraging polymorphic association in Ruby on Rails. ## 1. Storage Saving -One of the key advantages of using polymorphic association is the efficient use of storage. Unlike traditional methods where blank columns might be created for existing records, polymorphic association allows data to be added to a dedicated table, avoiding the creation of unnecessary columns. +One of the key advantages of using polymorphic association is the efficient use of storage. +Unlike traditional methods where blank columns might be created for existing records, polymorphic association allows data to be added to a dedicated table, avoiding the creation of unnecessary columns. This not only saves storage space but also ensures a cleaner and more organized database structure. @@ -25,23 +27,28 @@ This not only saves storage space but also ensures a cleaner and more organized Polymorphic association enables architectural separation by allowing developers to track specific functionality in a different table without impacting the main table responsible for holding core data. -This separation proves invaluable when dealing with functionalities that sync with other systems. Developers can create similar tables for different sync functionalities, maintaining a clear and modular architectural design. +This separation proves invaluable when dealing with functionalities that sync with other systems. +Developers can create similar tables for different sync functionalities, maintaining a clear and modular architectural design. ## 3. Flexibility -Flexibility is a hallmark of polymorphic association. With a dedicated table for a specific functionality, such as tracking errors, developers have the freedom to add more columns like `last_error`, `error_code`, and others without impacting the main table. +Flexibility is a hallmark of polymorphic association. +With a dedicated table for a specific functionality, such as tracking errors, developers have the freedom to add more columns like `last_error`, `error_code`, and others without impacting the main table. This flexibility ensures that the database schema can adapt to changing requirements without the need for extensive modifications. ## 4. Better Indexing -Maintaining optimal performance is crucial for any application, and polymorphic association aids in achieving better indexing. Adding numerous indexes to a single table can lead to performance degradation. +Maintaining optimal performance is crucial for any application, and polymorphic association aids in achieving better indexing. +Adding numerous indexes to a single table can lead to performance degradation. -By separating functionality into dedicated tables, developers can create indexes tailored to specific needs without impacting the performance of the main table. This approach contributes to a more efficient and responsive application. +By separating functionality into dedicated tables, developers can create indexes tailored to specific needs without impacting the performance of the main table. +This approach contributes to a more efficient and responsive application. ## 5. Easy Attachability -Enabling functionality for multiple models becomes a seamless process with polymorphic association. In the case of our example, where functionality is enabled for three models, additional models can adopt the same functionality without requiring any database changes. +Enabling functionality for multiple models becomes a seamless process with polymorphic association. +In our example, where functionality is enabled for three models, additional models can adopt the same functionality without requiring any database changes. Simply including the relevant module in the specific model is all that's needed, providing a hassle-free approach to extending functionality across different parts of the application. @@ -109,13 +116,18 @@ class Doctor < ApplicationRecord include Aws::SyncTrack end ``` -In this example, we've implemented a polymorphic association using the AwsSyncStatus model. The Aws::SyncTrack concern is included in both the Patient and Doctor models, providing them with AWS synchronization tracking capabilities. + +In this example, we've implemented a polymorphic association using the AwsSyncStatus model. +The Aws::SyncTrack concern is included in both the Patient and Doctor models, providing them with AWS synchronization tracking capabilities. This modularity allows for easy attachment of the AWS synchronization functionality to multiple models without the need for extensive database modifications. By utilizing polymorphic associations in this manner, developers can seamlessly extend functionality across various models, promoting a clean and modular approach to application development. ## Conclusion -Polymorphic association in Ruby on Rails emerges as a valuable tool for database management and application architecture. From storage savings and architectural separation to flexibility and better indexing, the benefits of adopting polymorphic association are diverse and impactful. -By incorporating this feature into your Rails projects, you can enhance both the efficiency and maintainability of your application's database design. The real-world example of AWS synchronization illustrates how polymorphic association facilitates the easy integration of specific functionalities across different models, showcasing the power and flexibility it brings to web development. \ No newline at end of file +Polymorphic association in Ruby on Rails emerges as a valuable tool for database management and application architecture. +From storage savings and architectural separation to flexibility and better indexing, the benefits of adopting polymorphic association are diverse and impactful. + +By incorporating this feature into your Rails projects, you can enhance both the efficiency and maintainability of your application's database design. +The real-world example of AWS synchronization illustrates how polymorphic association facilitates the easy integration of specific functionalities across different models, showcasing the power and flexibility it brings to web development.