12/08/2018, 14:48

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!

0