如何在rails 3中合并两个活动记录关系和OR条件并返回结果也是一个活动关系而不是数组?

时间:2015-12-05 08:53:50

标签: ruby-on-rails ruby ruby-on-rails-3 activerecord arel

我有两个关联,比如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解决这个问题。

我尽力理解我的问题。如果需要其他任何信息,请告诉我。 提前致谢!

2 个答案:

答案 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)