我有两个关联,比如surgical_diseases和eye_disease。我想获得两个活动关系的Ored结果。但是下面的代码给了我一个数组。
has_many :surgical_diseases
has_many :eye_disease
scope :all_disease ->(name) { joins(:surgical_diseases).where('surgical_diseases.name IN (?)') | joins(:eye_disease).where('eye_disease.name IN (?)') }
我见过active-record-union
gem,但这只能用于活动记录4.我目前正在使用rails 3.2,因此无法使用它。
我还看到这个功能将随带有dhh' commit的rails5一起提供。但不知道我现在如何用rail3解决这个问题。
我尽力理解我的问题。如果需要其他任何信息,请告诉我。 提前致谢!
答案 0 :(得分:1)
您可能需要使用find_by_sql获取ID,然后找到这些ID以获取ActiveRecord :: Relation。
scope :all_disease ->(name) {
ids = YourTable.find_by_sql <<-SQL
SELECT your_table.id FROM your_table INNER JOIN surgical_diseases sd ON sd.your_table_id=your_table.id WHERE sd.name IN (#{name})
UNION
SELECT your_table.id FROM your_table INNER JOIN eye_diseases ed ON ed.your_table_id=your_table.id WHERE ed.name IN (#{name})
SQL
YourTable.where(id: ids)
}
答案 1 :(得分:0)
也许,左外连接可以帮助你:
scope :all_disease ->(name) {
joins('LEFT OUTER JOIN surgical_diseases ON surgical_diseases.whatever_table_for_your_models_id = whatever_table_for_your_models.id')
.joins('LEFT OUTER JOIN eye_diseases ON eye_diseases.whatever_table_for_your_models_id = .whatever_table_for_your_models.id')
.where('surgical_diseases.name IN (?) OR eye_diseases.name IN (?)', name)