Alias và Delegate trong rails
Delegate Trong lập trình ruby, có rất nhiều cách giúp bạn chuyển tiếp đối tượng. Delegate là một trong những cách đó. Delegate giúp gọi các public methods của object khác giống như là của chính mình. Delegate rất hữu ích với Active Record associations. ví dụ: Ta có bảng Candidate chứa : ...
Delegate
Trong lập trình ruby, có rất nhiều cách giúp bạn chuyển tiếp đối tượng. Delegate là một trong những cách đó. Delegate giúp gọi các public methods của object khác giống như là của chính mình. Delegate rất hữu ích với Active Record associations. ví dụ: Ta có bảng Candidate chứa : image_avatar, name và bảng CandidateDetail chứa : artist, genre, country.
class Candidate < ActiveRecord::Base has_one :CandidateDetail end
class CandidateDetail < ActiveRecord::Base belongs_to :Candidate end
thông thường nếu không dùng delegate chúng ta muốn lấy ra trường artist trong model schedule thì ta sẽ phải query: Candidate.CandidateDetail.artist
Với delegate ta có thể lấy artist bằng cách : Candidate.artist
chỉ cần thêm câu sau vào trong class candidate: delegate :artist, to: :CandidateDetail
có thể delegate nhiều method tới cùng một target bằng cách: delegate :artist, genre, country, to: :CandidateDetail
trong delegate còn có các option:
- allow_nil Trả về nil thay vì lỗi NoMethodError khi target của method được delegate là nil delegate :artist, genre, country, to: :CandidateDetail, allow_nil: true
- prefix Thêm prefix giúp tên của delegate methods dễ hiểu hơn delegate :artist, genre, country, to: :CandidateDetail, prefix: true, allow_nil: true khi đó sẽ là: Candidate.CandidateDetail_artist, Candidate.CandidateDetail_genre
Alias và alias_method
chúng đều được sử dụng để tạo ra tên gọi khác cho các method trong ruby.
alias
class User def full_name puts "Johnnie Walker" end alias name full_name end User.new.name #=>Johnnie Walker
alias_method
class User def full_name puts "Johnnie Walker" end alias_method :name, :full_name end User.new.name #=>Johnnie Walker
Sự khác biệt đầu tiên bạn sẽ nhận thấy là trong trường hợp của alias_method alias_method: chấp nhận các tham số truyền vào dưới dạng tring hoặc symbol và sử dụng dấu "," để tách giữa 2 tham số alias: chỉ chấp nhận symbol là tham số và không sử dụng "," chú ý: Điểm khác biệt lớn nhất giữa alias và alias_method là phạm vi trong việc thực hiện. sử dụng alias khi bạn muốn giới hạn phạm vi mà nó được định nghĩa sử dụng alias_method để cho phép các lớp kế thừa để truy cập nó
bên trên là bài viết giới thiệu về Alias, Alias_method, và delegate hy vọng sẽ giúp các bạn hiểu về chúng!