首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ransack和find_by_sql

Ransack和find_by_sql
EN

Stack Overflow用户
提问于 2019-03-19 16:12:26
回答 1查看 306关注 0票数 0

有没有一种在find_by_sql中使用ransack的方法?

我有这个:

代码语言:javascript
复制
def index
  @p = Patient.ransack(params[:q])
  @patients = @p.result.page(params[:page])

end

但我需要:

代码语言:javascript
复制
  @p = Patient.find_by_sql(
    "SELECT DISTINCT first_name, last_name, gender,  MAX(S.surgery_date)
     FROM patients P
     LEFT JOIN
     hospitalizations H
     ON
     P.id = H.patient_id
     LEFT JOIN
     surgeries S
     ON
     S.hospitalization_id = H.id
     GROUP BY first_name, last_name, gender")
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-19 16:58:58

我建议避免使用find_by_sql,并将查询转换为更真实的ActiveRecord查询。

Rails 5+中,您可以尝试以下操作:

代码语言:javascript
复制
class Patient < ApplicationRecord
   scope :basic_info, -> { 
        self.left_joins(hospitalizations: :surgery)
           .distinct
           .select("first_name, 
                    last_name, 
                    gender,  
                    MAX(surgeries.surgery_date) as most_recent_surgery")
           .group("first_name, last_name, gender")
   }
end

这将提供与find_by_sql相同的SQL,但将返回ActiveRecord::Relation而不是ActiveRecord::Result。这样就可以将洗劫者与反应联系在一起,如:

代码语言:javascript
复制
def index
  @p = Patient.basic_info.ransack(params[:q])
  @patients = @p.result.page(params[:page])

end

如果您使用的Rails小于5,那么它会变得比较混乱,但是下面的内容仍然会提供相同的内容

代码语言:javascript
复制
class Patient < ApplicationRecord
   scope :basic_info, -> { 
        patient_table = Patient.arel_table
        hospitalizations_table = Hospitaliztion.arel_table
        surgeries_table = Surgery.arel_table
        patient_join = patient_table.join(hospitalizations_table,Arel::Nodes::OuterJoin).on(
            hospitalizations_table[:patient_id].eq(patient_table[:id])
        ).join(surgeries_table, Arel::Nodes::OuterJoin).on(
          surgeries_table[:hospitalization_id].eq(hospitalizations_table[:id])
        )  
        self.joins(patient_join.join_sources)
           .select("first_name, 
                    last_name, 
                    gender,  
                    MAX(surgeries.surgery_date) as most_recent_surgery")
           .group("first_name, last_name, gender")
   }
end
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55245474

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档