Полиморфный has_many_through в Rails

У меня есть две модели Rails, и я бы хотел, чтобы между ними были установлены множественные отношения. У меня есть стол Intervention и модель под названием Subject, У меня также есть модель подключения под названием InterventionsSubject что я надеялся использовать, чтобы присоединиться к двум вместе. Я хотел бы связать между ними так, чтобы вмешательства effective_subjects, ineffective_subjects а также negative_subjects, Моя таблица настроена следующим образом (упрощено для краткости):

create_table "interventions", force: :cascade do |t|
  t.string "title"
  t.text "intro"
  t.text "how"
  t.text "studies"
end

create_table "subjects", force: :cascade do |t|
  t.string "title"
end

create_table "interventions_subjects", force: :cascade do |t|
  t.bigint "intervention_id"
  t.bigint "subject_id"
  t.integer "type"
  t.index ["intervention_id"], name: "index_interventions_subjects_on_intervention_id"
  t.index ["subject_id"], name: "index_interventions_subjects_on_subject_id"
end

Я пробовал несколько заклинаний, чтобы настроить это, но я не могу найти лучший способ сделать это. Есть идеи?

2 ответа

Вы можете попробовать использовать полиморфную связь рельсов между вмешательствами и субъектами. Сделайте интервальную полиморфную таблицу, добавив что-то вроде subjectable_type и subject_id. Упомяните полиморфную ассоциацию в модели вмешательства - own_to: субъект и в модели субъекта has_many: вмешательства, как:: субъект. обратитесь за дополнительной информацией: https://guides.rubyonrails.org/association_basics.html Надеюсь, что это помогает.

Как я уже упоминал в комментарии выше, на самом деле это не полиморфные отношения. Я думаю, что вам нужны области, которые вы можете использовать как для поиска, так и для создания объектов. Взгляните на https://guides.rubyonrails.org/active_record_querying.html и https://api.rubyonrails.org/classes/ActiveRecord/Scoping/Named/ClassMethods.html, который имеет много примеров.

Я думаю, что вы хотите добавить области для вашего type поле для intervention_subjects, Тогда вы должны быть в состоянии сделать такие вещи, как intervention.subjects.effective,

Другие вопросы по тегам