搜查和 find_by_sql
Ransack and find_by_sql
有没有办法通过 find_by_sql 使用搜查?
我有这个:
def index
@p = Patient.ransack(params[:q])
@patients = @p.result.page(params[:page])
end
但我需要:
@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")
我建议避免 find_by_sql
并将您的查询转换为更真实的 ActiveRecord 查询
In Rails 5+ 您可以尝试以下操作:
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,但 return 是 ActiveRecord::Relation
而不是 ActiveRecord::Result
。这应该允许将 ransack 链接到响应,如下所示:
def index
@p = Patient.basic_info.ransack(params[:q])
@patients = @p.result.page(params[:page])
end
如果您使用的 Rails 小于 5 那么它会变得有点混乱,但以下内容仍将提供相同的
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
有没有办法通过 find_by_sql 使用搜查?
我有这个:
def index
@p = Patient.ransack(params[:q])
@patients = @p.result.page(params[:page])
end
但我需要:
@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")
我建议避免 find_by_sql
并将您的查询转换为更真实的 ActiveRecord 查询
In Rails 5+ 您可以尝试以下操作:
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,但 return 是 ActiveRecord::Relation
而不是 ActiveRecord::Result
。这应该允许将 ransack 链接到响应,如下所示:
def index
@p = Patient.basic_info.ransack(params[:q])
@patients = @p.result.page(params[:page])
end
如果您使用的 Rails 小于 5 那么它会变得有点混乱,但以下内容仍将提供相同的
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