我有一个具有许多关系的rails 4.2.8应用程序。我的相互作用模型有和属于许多基因(具体来说,一个相互作用可以有2个基因,而一个基因可以属于任意数量的相互作用),而基因模型反过来又有许多药物和疾病。
我试图让用户根据其基因中是否有药物和/或与之相关的疾病来过滤交互作用。如果选择了药物或疾病的“过滤器”,下面的代码将按要求工作,因为所有与至少一个基因的相互作用都会被显示出来。
然而,当检查这两个筛选器时,我只显示其中一个或两个基因至少有一种药物和,至少有一种相关疾病的相互作用。我想要展示的也是相互作用,其中一个基因有药物,但没有疾病,而另一个基因有疾病/s,但没有药物相关。
模型
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?
...我没有找到任何明显解决这个问题的方法/问题,尽管这可能是因为我找不到能够简洁地解决问题的单词,无法有效地进行搜索。
提前感谢!
发布于 2018-05-10 13:20:46
在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.工会
Gem 友联市 gem为Rails提供了SQL支持。
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?共同建议:使用通用查询而不是域来设计数据库。
https://stackoverflow.com/questions/50271407
复制相似问题