delegate を、直接のリレーションを持たない孫モデルに定義する方法についてまとめます。

例: 以下の状況で、Companyaddress カラムを Profile で呼び出したいとき、

class Company < ApplicationRecord
  has_one :user
end

class User < ApplicationRecord
  belongs_to :company
  has_one : profile
end

class Profile < ApplicationRecord
  belongs_to :user
end

UserProfile に以下のように delegate を定義することで、Profile から address が呼び出せるようになります。

class User < ApplicationRecord
  belongs_to :company
  has_one : profile
+
+ delegate :address, to: :company
end

class Profile < ApplicationRecord
  belongs_to :user
+
+ delegate :address, to: :user
end

prefix: true をつけることでメソッドを一意に指定することができますが、孫モデルに当たる Profile では prefix がついた後の company_address を指定しないといけないことに注意が必要です。

class User < ApplicationRecord
  belongs_to :company
  has_one : profile

- delegate :address, to: :company
+ delegate :address, to: :company, prefix: true
end

class Profile < ApplicationRecord
  belongs_to :user

- delegate :address, to: :user
+ delegate :company_address, to: :user, prefix: true
end

これによって、profile.user_company_address のようにアクセスすることができます。

参考