Чтобы добавить к ответу Джоша, иногда вам может понадобиться поделиться кодом, определяющим полиморфную ассоциацию. Вы не можете просто поместить вызов метода has_many
в свой модуль, потому что вы получите ошибку, например, в модуле с именем Votable:
undefined method `has_many' for Voteable:Module (NoMethodError)
Так что вместо этого вам нужно использовать метод self.included(base)
и base.instance_eval
. Вот пример с моим Voteable
модулем:
module Voteable
def self.included(base)
base.instance_eval do
has_many :votes, as: :voteable
has_many :voters, through: :votes
end
end
def voted_up_by?(user)
user and votes.exists?(value: 1, voter_id: user)
end
def voted_down_by?(user)
user and votes.exists?(value: -1, voter_id: user)
end
end
Теперь вы можете include Voteable
в моделях, которые будут иметь такое поведение. Это выполнит метод self.included(base)
и определит ассоциацию для включающего класса.