возможно ли получить доступ к методу отношения общего родителя с использованием делегата

#ruby-on-rails #ruby

#ruby-on-rails #ruby

Вопрос:

 
class Proposition < ApplicationRecord
  belongs_to :milestone, optional: true
  delegate :title, to: :milestone, allow_nil: true, prefix: :milestone
  delegate :title, to: :milestone, allow_nil: true, prefix: :procedure
end

class Milestone < ApplicationRecord
  belongs_to :procedure
  delegate   :title, to: :procedure, allow_nil: true, prefix: :procedure
end

class Procedure < ApplicationRecord
end


proposition.milestone_title #=> works
proposition.procedure_title #=> error


 

для этого мне кажется, что мне нужно определить метод в классе Milestone.
есть ли лучший способ получить методы дедушки и бабушки?

Комментарии:

1. какая ошибка возникает? proposition.procedure_title можете ли вы добавить журналы?

2. вы неправильно обрабатываете параметр prefix. Посмотрите на примеры здесь apidock.com/rails/Module/delegate

Ответ №1:

delegate передает метод из другого объекта, передаваемый через метод экземпляра, который предоставляет его экземплярам текущего объекта. Итак, с:

 class Proposition < ApplicationRecord
  belongs_to :milestone, optional: true
end

class Milestone < ApplicationRecord
  belongs_to :procedure
  delegate   :title, to: :procedure, allow_nil: true, prefix: :procedure
end
 

Для экземпляра Proposition метода, который возвращает связанный Milestone экземпляр milestone , определяется как belongs_to .

Метод на связанной вехе, который возвращает заголовок из связанного Milestone с ним is procedure_title — because procedure , определяется как префикс в делегировании Milestone .

Таким образом, для делегирования milestone.procedure_title внутри Proposition метода делегата необходимо:

 delegate :procedure_title, to: :milestone, allow_nil: true
 

Если Milestone у него есть свой собственный title метод, а Proposition также заголовок, будет работать следующее:

 class Proposition < ApplicationRecord
  belongs_to :milestone, optional: true
  delegate :title, to: :milestone, allow_nil: true, prefix: :milestone
  delegate :procedure_title, to: :milestone, allow_nil: true
end

class Milestone < ApplicationRecord
  belongs_to :procedure
  delegate   :title, to: :procedure, allow_nil: true, prefix: :procedure
end

class Procedure < ApplicationRecord
end

proposition.title #=> Proposition's title
proposition.milestone_title #=> Milestone's title
proposition.procedure_title #=> Procedure's title