TODAY I LEARNED by vàithằngnhốnhăng

Polymorphism in Rails

Trong OOP có 4 khái niệm là:

  • Abstraction (trừu tượng)
  • Polymorphism (đa hình)
  • Inheritance (kế thừa)
  • Encapsulation (Bao đóng)

Cách nhớ là: 4 kí tự đầu tiên tạo thành chữ: A PIE

Bài này nói về Tính đa hình: Polymorphism

Trong OOP nói chung

Đa hình nghĩa là khi mà 1 phương thức có những hành vi khác nhau

Trong Rails nói riêng

Các giải thích dễ hiểu như sau:

Có một class là Manager, một class là nhân viên Employee

Manager thì đi ô tô. Nhân viên thì đi xe máy. Về bản chất thì đây đều là xe/phương tiện đi lại. Sẽ có những phương thức chung như là: start, drive, stop v.v. Và tất nhiên cách start của xe máy và oto sẽ khác nhau rồi.

Nên về thiết kế thì mình sẽ làm như sau

# table managers
class Manager
  has_many :xes, as: :chu_phuong_tien
end

# table employees
class Employee
  has_many :xes, as: :chu_phuong_tien
end

# table xes
class Xe
  belongs_to :chu_phuong_tien, polymorphic: :true

  def start
    # ở đây ta có thể định nghĩa tuỳ theo đây là oto hay xe máy =))
  end
  def drive; end
  def stop; end
end

khi đó bảng xes thì ta sẽ có các cột:

  t.string  :name
  t.integer :chu_phuong_tien_id
  t.string  :chu_phuong_tien_type

ta cũng có những phương thức tương ứng:

  m = Manager.new
  e = Employee.new

  m.xes
  e.xes

  xe = Xe.new(name: "Teslaaaaa", chu_phuong_tien_id: 1, chu_phuong_tien_type: "Manager")
  xe.chu_phuong_tien # => Manager with id=1