Полиморфный 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
,