Чтобы добавить ответ Джошу, иногда вам может понадобиться поделиться некоторым кодом, определяющим полиморфную ассоциацию. Вы не можете просто поставить вызов 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)
, и он определит ассоциацию для включенного класса.
спасибо! вот что я в итоге использовал –
чувак. Это все о каталоге lib. Я начал вводить там больше кода, и это просто удобное место для организации вещей. –