2016-04-30 1 views
2

В приложении 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 показывает, что записи в таблице есть?

ответ

1

Это известная проблема при использовании полиморфных ассоциаций с ИППП.

См: Why polymorphic association doesn't work for STI if type column of the polymorphic association doesn't point to the base model of STI?

Лично я имею дело с этим вопросом сам, используя store_base_sti_class (драгоценный камень: https://github.com/appfolio/store_base_sti_class), который исправляет поведение STI с Rails.

+0

Благодаря @anthony, я наткнулся на это уже, но это замечание можно полагать, что я должен быть в состоянии назвать ребенка голосов: 'Рельсы прозрачно использует STI база Classname Staff в качестве целевого типа и в связи с тем, что идентификаторы всегда уникальны в таблице STI, не имеет значения, установлен ли тип Guard или Персонал в таблице poly, будет выбрана правильная запись. «Но, возможно, я неправильно понял этот комментарий. Во всяком случае, если я установил 'votable_type:« ActsAs :: Draft », я бы ожидал, что вы сможете вызвать« ActAs :: Draft.find (: id) .votes_for', правильно? Но я все равно получаю пустую коллекцию. –

+0

Спасибо за ваши мысли по этому поводу. Я думаю, что, возможно, что-то не хватает, поэтому оцените любую помощь или идеи, которые у вас есть. –

+0

неважно. У меня, должно быть, была ошибка в другом месте, так как теперь она работает так, как ожидалось, и я действительно могу назвать «ActAs :: Draft.find (: id) .votes_for'. Спасибо за вашу помощь. –

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