Ruby on Rails delegate model

紀錄 Rails 開發,在 Model 上使用 delegate 的情境。

Ruby on Rails delegate model
Photo by David Herron / Unsplash

紀錄 Rails 開發,在 Model 上使用 delegate 的情境。

Provides a delegate class method to easily expose contained objects’ public methods as your own.

間單來說,可以將 method 委派給指定的 class

範例

class Project < ApplicationRecord
  belongs_to :organization
end

class Organization < ApplicationRecord
  has_many :projects
end

開發上經常會這樣呼叫

@project.organization.title

如果使用了 delegate 委派,就會幫你產生一些 method。

如以下範例:

class Project < ApplicationRecord
  delegate :title, to: :organization, prefix: true, allow_nil: true
end

@project.organization_title

也可以使用 delegate 委派給相關的 class
例如:我們拆分一個 class ProjectMoney 專門來整理計算金額相關的 method,方便後續開發管理邏輯。

class Project < ApplicationRecord
  delegate :normal_money_pledged, to: :money

  def money
    @money ||= ProjectMoney.new(self)
  end
end

class ProjectMoney
  attr_reader(:project)

  def initialize(project)
    @project = project
  end
  
  def normal_money_pledged
    #...
  end
end

參考資料

https://apidock.com/rails/Module/delegate