полиморфные отношения и интерфейсы / абстрактные классы / протоколы - PullRequest
1 голос
/ 25 февраля 2012

У меня есть полиморфная модель Comments, которую я ассоциирую почти с любой другой моделью.У меня есть страница индекса комментариев, где я использую название модели, которое я называю commentable.

Как лучше всего обеспечить, чтобы модель commentable имела метод или атрибут с именем :title?

В Objective-C я определял бы протокол, а на других языкахопределить абстрактный класс или интерфейс.Я пытаюсь найти лучший способ написания кода для поддерживаемых рельсов.

1 Ответ

1 голос
/ 25 февраля 2012

Я бы написал метод для модели комментариев, который сделает это за вас.Итак, в comments.rb:

def title
  self.commentable.title if self.commentable.respond_to?(:title)
end

По вашему мнению, вы можете проверить, есть ли у комментария заголовок и отобразить его, или просто пропустить рендеринг:

<% if @commentable.title %>
  <h2><%= @commentable.title %></h2>
<% end %>

Это не совсем такпротокол или интерфейс, но в Ruby вы не можете легко указать, что объекты действуют определенным образом.Вы используете такие вещи, как response_to?чтобы увидеть, если они делают, и если так, то вы действуете.

...