2010-10-02 6 views
1

Итак, если у меня есть полиморфная ассоциация в моем приложении, есть ли способ добавить к ней методы? Например, если: post,: photo и: user все связаны с: рейтингом с полиморфной ассоциацией с именем: rankable, могу ли я каким-то образом создать методы: rankable, которые затем будут унаследованы: post,: photo или: user? Я предполагаю, что если это возможно, мне потребуется добавить в приложение модель Rankable и определить методы внутри нее. Это возможно? Если это так, и я прав, когда мне нужно создать модель, какой класс наследует эта модель или как я могу определить ее как полиморфную связь?Как добавить методы к полиморфной ассоциации рельсов?

ответ

3

Я не знаю, как вы могли бы сделать это с помощью модели, но вы можете легко добавить методы с Mixins:

module RankableMethods 
    def do_something_useful 
    ... 
    end 
end 

class Post < ActiveRecord::Base 
    include RankableMethods 
    belongs_to :rankable, :polymorphic = true 
end 

p = Post.new 
p.respond_to?(:do_something_useful) # true 
1

Вы должны отделить понятия «полиморфный», как он применяется к Полиморфная ассоциация ActiveRecord и «полиморфная» в классическом смысле наследования ООП.

Полиморфный тип «Rankable» в первом смысле не существует, кроме как соглашение о базе данных в ActiveRecord, которое позволяет записи в одной таблице ссылаться на записи в нескольких возможных других таблицах. Если вы хотите выразить эту абстракцию более конкретно в своей объектной модели - полиморфизм во втором смысле - вам придется объявить отдельный класс или модуль, которые могут быть объединены или наследованы вашими «Rankable» ActiveRecords.

Смежные вопросы