Область Rails 4 объединяется, чтобы найти или / или отношения - PullRequest
0 голосов
/ 10 мая 2018

У меня есть приложение rails 4.2.8 с рядом взаимосвязей.Моя модель взаимодействия имеет и принадлежит многим генам (в частности, взаимодействие может иметь 2 гена, в то время как ген может принадлежать к любому количеству взаимодействий), а модель гена, в свою очередь, имеет много лекарств и болезней.

Я пытаюсьпозволяют пользователям фильтровать взаимодействия на основе того, имеет ли тот или иной из его генов наркотик и / или заболевание, связанное с ним.Приведенный ниже код работает, как требуется, если выбран «фильтр» для препарата или болезни, так как отображаются все взаимодействия, по крайней мере, с одним геном, по крайней мере, с одной из этих ассоциаций.

Однако, когда оба фильтра отмечены, яотображает только взаимодействия, в которых один или оба из генов имеют по крайней мере одно лекарство и по крайней мере с одним заболеванием.Я хотел бы также показать взаимодействия, в которых у одного гена есть лекарственное средство (а), но нет заболевания, а у другого гена есть заболевание (я), но нет связанных с ним лекарств.

Модели

class Interaction < ActiveRecord::Base
    has_and_belongs_to_many :genes
    ...

    scope :disease_associated, -> { joins(genes: :diseases) }
    scope :drug_target, -> { joins(genes: :drugs) }
    ...
end

class Gene < ActiveRecord::Base
    has_and_belongs_to_many :interactions
    has_and_belongs_to_many :drugs
    ...
end

class Drug < ActiveRecord::Base
    has_and_belongs_to_many :genes
end

class Disease < ActiveRecord::Base
    has_and_belongs_to_many :genes
end

Контроллер взаимодействия

class InteractionsController < ApplicationController
    ...
    @interactions = @interactions.disease_associated() if params[:filter_disease].present?
    @interactions = @interactions.drug_target() if params[:filter_druggable].present?
    ...

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

Заранее спасибо!

1 Ответ

0 голосов
/ 10 мая 2018

В Rails 4 я могу предложить два варианта:

1.Список идентификаторов

ids = []
ids |= Interaction.disease_associated.pluck(:id) if params[:filter_disease].present?
ids |= Interaction.drug_target.pluck(:id) if params[:filter_druggable].present?

interactions = Interaction.where(id: ids)

Ясно, но не очень хорошо, если в базе данных много взаимодействий.

2.UNION

Gem active_record_union gem предоставляет поддержку SQL UNION для Rails.

interactions = Interaction.none
interactions = interactions.union(Interaction.disease_associated) if params[:filter_disease].present?
interactions = interactions.union(Interaction.drug_target) if params[:filter_druggable].present?

PS Советы: создавайте БД по общим запросам, а не по домену.

...