Ассоциация полиморфных принадлежностей определенного типа

Я относительно новичок в Rails. Я хотел бы добавить ассоциацию к модели, которая использует полиморфную ассоциацию, но возвращает только модели определенного типа, например:

class Note < ActiveRecord::Base
  # The true polymorphic association
  belongs_to :subject, polymorphic: true

  # Same as subject but where subject_type is 'Volunteer'
  belongs_to :volunteer, source_association: :subject
  # Same as subject but where subject_type is 'Participation'
  belongs_to :participation, source_association: :subject
end

Я пробовал множество комбинаций из чтения об ассоциациях на ApiDock, но, похоже, ничто не делает именно то, что я хочу. Вот лучшее, что у меня есть:

class Note < ActiveRecord::Base
  belongs_to :subject, polymorphic: true
  belongs_to :volunteer, class_name: "Volunteer", foreign_key: :subject_id, conditions: {notes: {subject_type: "Volunteer"}}
  belongs_to :participation, class_name: "Participation", foreign_key: :subject_id, conditions: {notes: {subject_type: "Participation"}}
end

И я хочу, чтобы он прошел этот тест:

describe Note do
  context 'on volunteer' do
    let!(:volunteer) { create(:volunteer) }
    let!(:note) { create(:note, subject: volunteer) }
    let!(:unrelated_note) { create(:note) }

    it 'narrows note scope to volunteer' do
      scoped = Note.scoped
      scoped = scoped.joins(:volunteer).where(volunteers: {id: volunteer.id})
      expect(scoped.count).to be 1
      expect(scoped.first.id).to eq note.id
    end

    it 'allows access to the volunteer' do
      expect(note.volunteer).to eq volunteer
    end

    it 'does not return participation' do
      expect(note.participation).to be_nil
    end

  end
end

Первый тест проходит, но вы не можете вызвать отношение напрямую:

  1) Note on volunteer allows access to the volunteer
     Failure/Error: expect(note.reload.volunteer).to eq volunteer
     ActiveRecord::StatementInvalid:
       PG::Error: ERROR:  missing FROM-clause entry for table "notes"
       LINE 1: ...."deleted" = 'f' AND "volunteers"."id" = 7798 AND "notes"."s...
                                                                    ^
       : SELECT  "volunteers".* FROM "volunteers"  WHERE "volunteers"."deleted" = 'f' AND "volunteers"."id" = 7798 AND "notes"."subject_type" = 'Volunteer' LIMIT 1
     # ./spec/models/note_spec.rb:10:in `block (3 levels) in <top (required)>'
Зачем?

Причина, по которой я хочу сделать это таким образом, заключается в том, что я создаю область, основанную на анализе строки запроса, включая объединение с различными моделями / etc; код, используемый для построения области видимости, значительно сложнее, чем приведенный выше - он используетcollection.reflectionsи т. д. Мое текущее решение работает для этого, но оскорбляет меня, я не могу вызвать отношения напрямую из экземпляра Note.

Я мог бы решить эту проблему, разделив ее на две части: напрямую использовать области

  scope :scoped_by_volunteer_id, lambda { |volunteer_id| where({subject_type: 'Volunteer', subject_id: volunteer_id}) }
  scope :scoped_by_participation_id, lambda { |participation_id| where({subject_type: 'Participation', subject_id: participation_id}) }

а затем просто используя геттер дляnote.volunteer/note.participation&nbsp;это просто возвращаетnote.subject&nbsp;если это имеет правоsubject_type&nbsp;(ноль в противном случае), но я решил, что в Rails должен быть лучший способ?