0

我有这些模型:

SpaceShip < ActiveRecord::Base
  has_one :martian
  has_many :people

Person < ActiveRecord::Base
  has_many :skills

Martian < ActiveRecord::Base
  belongs_to :skill

Skill < ActiveRecord::Base

#rest omitted 

我需要有一个范围来找到 martian.skill.name = 'drive' 或 person.skill.name = 'drive' 的宇宙飞船

起初看起来很容易,但事实并非如此:

Spaceship < ActiveRecord::Base 
scope :by_skill_name, -> (skill_name){
                                     joins([[people: :skills], [martian: :skill]])
                                     .where('skills.name=?', skill_name)
                                     } 

这个范围不起作用,因为只考虑了关联martian.skill

我尝试在 SQL 中制作连接部分并使用表别名。它可以工作,但与其他范围链接时会出现 SQL 错误。

我也尝试过,joins(...).merge(joins(...))但我仍然只得到最后一个关系。

Active Record 没有'union' 声明,我已经看到了一些实现它的方法,但我不知道它是否会太复杂和hacky。

任何想法?

谢谢。

编辑:

到目前为止,我使用squeel where{(martian.skill.eq skill_name)|(people.skills.eq skill_name)}解决了它,但我想知道它是否可以在普通 AR 中实现。

4

0 回答 0