Series Hướng Dẫn Lập Trình Ruby on Rails (Phần 8) – Các kỹ thuật trong Rails bạn nên biết

Chào các bạn,

Dạo này công việc hơi bận rộn nên Series Hướng Dẫn Lập Trình Ruby on Rails của mình có bị gián đoạn trong 2 tháng qua 😄.

Hôm nay mình sẽ tiếp tục hướng dẫn các bạn Phần 8 của Series này, trong phần này mình sẽ hướng dẫn các bạn các kỹ thuật quan trọng trong Ruby on Rails mà bạn cần nắm rõ.

Nếu các bạn hiểu rõ được tất cả những kỹ thuật mà mình sẽ hướng dẫn sau đây, mình tin chắc các bạn sẽ có thể dễ dàng giải quyết phần lớn các yêu cầu đặt ra của dự án rồi đấy.

Mình sẽ chia các kỹ thuật trong Rails ra làm 2 loại chính :

  • Ruby on Rails basic technical
  • Gem support

Ruby on Rails Basic Technical

Như các bạn đã biết Rails là framework hoạt động dựa trên mô hình M-V-C do đó các kỹ thuật của Rails basic chủ yếu sẽ xoay quanh 3 thành phần Model-View-Controller để giúp chúng ta xử lý các vấn đề liên quan phát sinh trong lúc xây dựng ứng dụng.

Chúng ta chỉ việc bám sát các thành phần trên và tìm hiểu các kỹ thuật xung quanh hỗ trợ cho chúng là có thể tự tin phát triển một ứng dụng ngon lành (lol)

ActiveRecord – Model

Đối với ActiveRecord ta nên biết những kỹ thuật sau đây :

Query Interface

Guides: http://guides.rubyonrails.org/active_record_querying.html#conditions

Đây là một trong những phần rất quan trọng mà bạn thường xuyên sử dụng mỗi ngày khi làm việc với Rails. Nó sẽ theo bạn từ bắt đầu học Ruby on Rails đến khi nào bạn hết sử dụng Rails thì thôi :v

Thằng Model của chúng ta lúc tạo ra mặc định đã kế thừa từ lớp ActiveRecord, như các bạn đã biết ActiveRecord sử dụng cơ chế ORM(Object Relational Mapping) để tương tác với Database.

Điều này có nghĩa là ứng dụng Rails sẽ làm việc với tầng ActiveRecord, còn việc kết nối đến Database như thế nào thì tầng ActiveRecord sẽ tự lo lấy. Việc này giúp ứng dụng Rails độc lập với Database bên dưới, không phụ thuộc vào cú pháp của từng loại Database nữa, và chỉ sử dụng truy vấn thông qua Query Interface của nó.

Các phương thức để retrieving đối tượng từ database thường dùng:

  • find
  • find_by
  • take
  • where
  • select
  • all
  • find_each
  • group (group_by)
  • having
  • limit
  • joins
  • includes
  • distinct
  • order

Ngoài ra còn rất nhiều phương thức khác, các bạn hãy vào trang chủ guides để xem nhé 😃

Các câu lệnh ở trên là để thay thế các truy vấn SQL cơ bản, trong phần Query Interface này có một số kỹ thuật nâng cao theo mình bạn nên chú ý kỹ:

  • Lazy loading vs Eager loading: cơ chế load các đối tượng của Rails khi truy vấn
  • includes vs joins method: các bạn nên nghiên cứu lúc nào thì dùng joins lúc nào thì dùng includes để tối ưu hóa thời gian truy vấn DB. Đây là kỹ thuật mà bạn sẽ ứng dụng rất nhiều trong dự án thực tế với DB có dữ liệu lớn với includes bạn sẽ tránh được việc query N + 1 giúp tối ưu hóa câu query của các bạn hơn.
    Mình cũng đã có copy bài viết rất hay về phần này, các bạn có thể tham khảo tại đây
    https://viblo.asia/p/includes-vs-joins-in-rails-when-and-where-gDVK2aDr5Lj
  • scope: cho phép bạn chỉ định các truy vấn thường được sử dụng, nó cũng gần giống như class method, chỉ khác lúc pass params nil hoặc “”
  • Find or build new object: nó cho phép bạn tìm kiếm record hoặc tạo mới nếu nó chưa tồn tại:
    • find_or_create_by
    • find_or_initialize_by
  • find_by_sql: nếu bạn muốn dùng câu SQL của chính bạn đã biết, các bạn có thể sử dụng method find_by_sql
    example:
      Client.find_by_sql("SELECT * FROM clients
      INNER JOIN orders ON clients.id = orders.client_id
      ORDER BY clients.created_at desc")

Ở các bài hướng dẫn tiếp theo mình sẽ thực hiện một project mẫu và sẽ áp dụng tất cả các kỹ thuật trên để các bạn có thể hiểu rõ hơn về từng kỹ thuật nhé 😃

Associations

Trang chủ của Rails có hẳn cho chúng ta một trang nói về Association trong Active Record đây
Guides: http://guides.rubyonrails.org/association_basics.html
Để tìm hiểu thật sâu thì các bạn chịu khó vào đọc nhé.

Khái quát về định nghĩa: Association là một sự kết nối giữa 2 Active Record models. Nó sẽ tạo nên các hành động chung đơn giản và dễ dàng trong việc truy vấn dữ liệu của bạn.

Các kiểu Associations:

  • belongs_to
  • has_one
  • has_many
  • has_many :through
  • has_one :through
  • has_and_belongs_to_many

Chi tiết mình sẽ có các bài viết sau mô tả chi tiết về định nghĩa từng loại và cách hoạt động của chúng. Ở bài viết này mình chỉ liệt kê ra danh sách các technical mà mình cho là cần thiết đối với 1 RoR developer mà thôi 😃

Validations

Guides: http://guides.rubyonrails.org/active_record_validations.html

Khái quát về định nghĩa: Validations được sử dụng trong Actice Record với mục đích để chắc chắn rằng chỉ những dữ liệu hợp lệ mới được lưu vào database.
Hiểu đơn giản Validations giúp chúng ta khởi tạo các điều kiện ràng buộc cho dữ liệu sẽ được lưu trữ.
vd : Model User với các fields name, email, password
Yêu cầu: name không được quá 12 ký tự, email phải theo đúng định dạng xxx@xxx, password: gồm chữ hoa thường và số.

Để ràng buộc các giá trị valid cho các fields trên ta sẽ sử dụng Validations

Các validations helper thường dùng:

  • presence: yêu cầu attributes không được empty (nil hoặc “”, ” “)
  • length: yêu cầu độ dài giá trị của attributes. (maximum, minimum)
  • uniqueness: yêu cầu giá trị của attributes phải là duy nhất
  • format: yêu cầu giá trị của attributes phải match với một biểu thức chính quy Regular Expression

Ngoài ra còn nhiều helper khác nữa các bạn tham khảo thêm nhé

Callbacks

Guides: http://guides.rubyonrails.org/active_record_callbacks.html

Khái quát về định nghĩa:
Trước hết để hiểu về Callbacks là gì ? chúng ta sẽ đi đến khái niệm The Object Life Cycle tạm hiểu là vòng đời của một đối tượng.

The Object Life Cycle trong Rails object sẽ trải qua các giai đoạn created, updated và destroyed. Active Record cung cấp các phương thức để chúng ta hooks được vào object life cycle để thực hiện một số công việc mà chúng ta mong muốn. Các phương thức ấy được gọi là Callbacks.

Callbacks là những method được gọi vào các khoảnh khắc nhất định trong object’s life cycle.

Các callbacks được cung cấp sắn bởi Active Record:

  • before_validation
  • after_validation
  • before_save
  • after_save
  • around_save
  • before_create
  • after_create
  • around_create
  • before_update
  • after_update
  • before_destroy
  • after_destroy
  • after_commit/after_rollback

Về thứ tự độ ưu tiên các bạn có thể tham khảo thêm ở trên trang guildes nó đã sắp xếp rất rõ độ ưu tiên của các Callbacks, việc nắm rõ độ ưu tiên này rất quan trọng trong việc xử lý dữ liệu ở Model cái nào sẽ được lưu trước, thực thi trước, cái nào sẽ được thực thi sau.

Migration

Guides: http://guides.rubyonrails.org/active_record_migrations.html

Khái quát định nghĩa: Migrations là một đặc trưng của ActiveRecord cho phép bạn chỉnh sửa cấu trúc của Database theo thời gian, thay vì phải thay đổi Database bằng những câu lệnh SQL cũ, migrations cho phép bạn sử dụng một cách dễ dàng cú pháp Ruby DSL(domain specific language) để mô tả việc thay đổi DB.

Ruby DSL:

  • Migration
class CreateUploads < ActiveRecord::Migration
  def change
    create_table :uploads do |t|
      t.string :name
      t.attachment :file
      t.timestamps
    end
  end
end

ngoài ra còn sử dụng cho :

  • Rails routing
Rails.application.routes.draw do
  root 'pages#home'
  resources :pages, only: [:index, :show]
end
  • Rake task
namespace :backup do
 desc "Backup assets"
 task :assets => :environment do
   tar_assets
 end
end

Các lệnh thường dùng:

  • create_table
  • change_table
  • change_column
  • add_column
  • remove_column
  • add_foreign_key
  • remove_foreign_key
  • add_foreign_key
  • remove_foreign_key
  • add_index
  • remove_index

Ngoài ra còn nhiều phương thức khác nữa, các bạn tham khảo thêm ở link guildes migration của Rails ở trên nhé

Nested attributes

Guides: http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html

Khái quát định nghĩa: nested attributes cho phép các đối tượng con có thể được tạo, cập nhật đồng thời với đối tượng cha

example:
Ta có như sau class Post có nhiều class PostsImage, có nghĩa là một bài Post sẽ có nhiều hình ảnh được đăng tải cho bài Post đấy, và số lượng Image của mỗi bài Post sẽ khác nhau, tùy theo người dùng.

class Post < ActiveRecord
  has_many :posts_images

  accepts_nested_attributes_for :posts_images
end


class PostsImage < ActiveRecord
  belongs_to :post
end

Giờ để tạo được PostImage trong lúc tạo Post ta sẽ sử dụng tính năng Nested_attributes
Thường dùng với từ khóa: accepts_nested_attributes_for

Đây là một kỹ thuật được sử dụng rất nhiều trong khi phát triển ứng dụng Ruby on Rails, nên nắm kỹ thuật này thật tốt để dễ dàng trong việc tạo các record con.
Các bạn cũng có thể thao khảo thêm ở bài viết này để hiểu hơn :v

Trên đây là những kỹ thuật về phần ActiveRecord basic & advance, chắc hôm nay mình sẽ tạm dừng ở đây, kỳ tiếp mình sẽ tiếp tục với phần ActionController – Controller và ActionView – View và các Gem support

ActionView – View

Comming soon

ActionController – Controller

Comming soon

Gem Support

Comming soon

Bài viết liên quan

Series Hướng Dẫn Lập Trình Ruby on Rails (Phần 9) Hướng dẫn xây dựng ứng dụng API đơn giản với gem doorkeeper

Chào các bạn, Giới thiệu Hôm nay mình sẽ tiếp tục Series Hướng Dẫn Lập...

Series Hướng Dẫn Lập Trình Ruby on Rails (Phần 8) – Các kỹ thuật trong Rails bạn nên biết(3)

Chào các bạn, Hôm nay mình sẽ tiếp tục Series Hướng Dẫn Lập Trình Ruby...

Series Hướng Dẫn Lập Trình Ruby on Rails (Phần 8) – Các kỹ thuật trong Rails bạn nên biết(2)

Chào các bạn, Hôm nay mình sẽ tiếp tục Series Hướng Dẫn Lập Trình Ruby...

Series Hướng Dẫn Lập Trình Ruby on Rails (Phần 7) – Deploy App On Heroku

Xin chào các bạn, Hôm nay mình sẽ tiếp tục hướng dẫn các bạn Series...

Series Hướng Dẫn Lập Trình Ruby on Rails (Phần 6)

Chào các bạn, hôm nay mình sẽ tiếp tục phần 6 của Series Hướng dẫn...

Series Hướng Dẫn Lập Trình Ruby on Rails (Phần 5)

Chào các bạn, hôm nay mình sẽ tiếp tục phần 5 của Series Hướng dẫn...

Trả lời