我有这些模型:
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 中实现。