#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