对视图中的表列进行排序

时间:2020-12-22 21:52:48

标签: sorting ruby-on-rails-4 rubygems ruby-on-rails-5 ransack

我正在使用 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?

或者如果没有,除了使用数据表,我还有什么其他选择或宝石?

0 个答案:

没有答案