我正在使用 ruby on rails 6 开发我的应用程序,我需要应用一个函数,以便用户可以对表的行进行排序。我正在尝试 ransack gem 并且它运行良好,当我尝试对查询选择中的连接列进行排序时出现问题,ransack 无法识别它。 这是我的看法:
<div style="overflow-x:auto;">
<table class="table">
<!--<caption>Listado Actualizado...</caption>-->
<thead>
<tr>
<th scope="col">
<%= sort_link(@q, :code, 'Código medicamento país') %>
</th>
<th scope="col">
<%= sort_link(@q, :mx_standar, 'Descripción') %>
</th>
<th scope="col">
<%= sort_link(@q, :presentacion, 'Presentación') %>
</th>
<th scope="col">Acciones</th>
</tr>
</thead>
<tbody id="container_t_drugs_devices">
<%= render @t_drugs_devices %>
</tbody>
</table>
</div>
<div class="row">
<div class="col-md-12">
<%= will_paginate @t_drugs_devices %>
</div>
</div>
这是我的控制器:
def index
params[:por_pagina] = 10 if params[:por_pagina].nil?
params[:por_pagina] = TDrugsDevice.Busqueda_general_count(params).por_pais(session[:pais]).count if params[:por_pagina] == "Todos"
@q = TDrugsDevice.Busqueda_general(params).por_pais(session[:pais]).ransack(params[:q])
@t_drugs_devices = @q.result(distinct: true).paginate(page: params[:page]).per_page(params[:por_pagina].to_i)
respond_to do |format|
format.html
format.js
format.xls
end
end
这是我的 t_drugs_device 型号:
def self.Busqueda_general(params)
query = select("t_drugs_devices.*, concat(t_drugs_devices.trade_name,' (', dd.cientific_name, ' ',b.drug_concentration, ' ', d.code, ' ', c.code,')') as mx_standar, concat(mtp.code, ' ', ddc.quantity_per_package, ' ', mru.code) as presentacion")
query = query.joins("left outer join drugs_devices_countries ddc on (t_drugs_devices.id = ddc.t_drugs_device_id) left outer join detail_drugs_devices b on (ddc.detail_drugs_device_id = b.id) left outer join drugs_devices dd on (dd.id = b.drugs_device_id) left outer join pharmaceutical_forms c on (b.pharmaceutical_form_id = c.id) left outer join unit_sizes d on (b.unit_size_id = d.id)
left outer join m_type_packagings mtp on (mtp.id = ddc.m_type_packaging_id) left outer join m_reference_units mru on (mru.id = ddc.m_reference_unit_id)")
query = query.where("(lower(t_drugs_devices.code) LIKE :campo_busqueda or :campo_busqueda = '') OR (lower(concat(t_drugs_devices.trade_name,' (', dd.cientific_name, ' ',b.drug_concentration, ' ', d.code, ' ', c.code,')')) LIKE :campo_busqueda or :campo_busqueda = '') OR (lower(concat(mtp.code, ' ', ddc.quantity_per_package, ' ', mru.code)) LIKE :campo_busqueda or :campo_busqueda = '') ", {campo_busqueda: "%#{params[:buscador].try(:downcase)}%"})
end
我尝试在我的查询之外直接应用 order 的使用,而不使用 ransack 并且它有效:
@q = TDrugsDevice.Busqueda_general(params).por_pais(session[:pais]).order("mx_standar ASC")
是否可以让ransack将订单(“mx_standard ASC”)应用于我的查询而不是主表TDrugsDevice?
或者如果没有,除了使用数据表,我还有什么其他选择或宝石?