Alias và Delegate trong rails
Bài đăng này đã không được cập nhật trong 7 năm
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!
All rights reserved