В приложении Rails 4.2 У меня есть модель, которая наследуется от Draftsman.Как сформировать полиморфный has_many на унаследованный классе
module ActsAs
class Draft < Draftsman::Draft
include ActsAs::Votable
end
end
пользователей могут голосовать одобрить/отклонить изменения, и ActsAs :: Votable Mixin добавляет эти полиморфные ассоциации и методу.
module ActsAs
module Votable
extend ActiveSupport::Concern
included do
has_many :votes_for,
class_name: 'ActsAs::Vote',
as: :votable,
dependent: :destroy
end
end
end
Это прекрасно подходит для большинства родительских моделей, но у меня возникают проблемы с этим унаследованным классом Draftsman.
я могу создать голосование
ActsAs::Vote.last
=> #<ActsAs::Vote id: 10, votable_id: 6, votable_type: "Draftsman::Draft">
, но я не могу вернуть голоса проект в
@draft = ActsAs::Draft.find(6)
@draft.votes_for
=> #<ActiveRecord::Associations::CollectionProxy []>
Я попытался модифицировать метод создания голосов, чтобы установить votable_type как ActsAs :: Проект, а не унаследованный Draftsman :: Draft, но та же проблема сохраняется.
ActsAs::Vote.last
=> #<ActsAs::Vote id: 10, votable_id: 6, votable_type: "ActsAs::Draft">
@draft = ActsAs::Draft.find(6)
@draft.votes_for
=> #<ActiveRecord::Associations::CollectionProxy []>
Отношения явно не определены на Draftsmans :: Проект
@draft = Draftsman::Draft.find(6)
@draft.votes_for
NoMethodError: undefined method `votes_for' for #<Draftsman::Draft:0x007fd7e6de9660>
Почему я не могу принести дочерние голоса через @draft
, когда ActsAs::Vote.all
показывает, что записи в таблице есть?
Благодаря @anthony, я наткнулся на это уже, но это замечание можно полагать, что я должен быть в состоянии назвать ребенка голосов: 'Рельсы прозрачно использует STI база Classname Staff в качестве целевого типа и в связи с тем, что идентификаторы всегда уникальны в таблице STI, не имеет значения, установлен ли тип Guard или Персонал в таблице poly, будет выбрана правильная запись. «Но, возможно, я неправильно понял этот комментарий. Во всяком случае, если я установил 'votable_type:« ActsAs :: Draft », я бы ожидал, что вы сможете вызвать« ActAs :: Draft.find (: id) .votes_for', правильно? Но я все равно получаю пустую коллекцию. –
Спасибо за ваши мысли по этому поводу. Я думаю, что, возможно, что-то не хватает, поэтому оцените любую помощь или идеи, которые у вас есть. –
неважно. У меня, должно быть, была ошибка в другом месте, так как теперь она работает так, как ожидалось, и я действительно могу назвать «ActAs :: Draft.find (: id) .votes_for'. Спасибо за вашу помощь. –