Errores #5281
Actualizado por Oscar Abad hace 9 meses
h1. Especificación Cuando se realiza un filtrado por nombre en la vista de Acuerdos, lo hace por el campo "acuerdo_datos.acuerdo_actual" = true, cuyo nombre no coincide con el que se muestra cuando hay más de una versión del acuerdo, ya que accede a través de la propiedad :ultimos_datos, que obtiene la primera versión y no la última [order('acuerdo_datos.created_at asc')]. Además, los datos que se visualizan en la interfaz no coinciden con los obtenidos por la API, que proceden de la propiedad :actual_ultimos_datos, que obtiene la primera versión con "acuerdo_datos.acuerdo_actual" = true Ejemplo: Acuerdos filtrado por nombre: " CONVENIO ESPECÍFICO DE COLABORACION INTERINSTITUCIONAL ENTRE MINERD Y LA OEI" h1. Análisis Relaciones entre acuerdo y acuerdo_datos en el modelo: <pre><code class="ruby"> has_one :ultimos_datos, -> { order('acuerdo_datos.created_at asc') }, foreign_key: :acuerdo_id, class_name: 'AcuerdoDatos' has_one :actual_ultimos_datos, -> { where("acuerdo_datos.acuerdo_actual": true).order('acuerdo_datos.created_at asc') }, foreign_key: :acuerdo_id, class_name: 'AcuerdoDatos' </code></pre> Selector de los acuerdos en la acción listado del controlador AcuerdoController a partir de "acuerdo_datos.acuerdo_actual" => true": <pre><code class="ruby"> @acuerdos = @paginado = Acuerdo.includes({acuerdo_datos: [:acuerdos_contraparte, :acuerdos_aportacion, :acuerdos_area_actuacion, :acuerdos_pais]}, :acuerdos_estado). where("acuerdo_datos.acuerdo_actual" => true, "acuerdos_estado.estado_vigente" => true). joins(join_tables).where(filters).where(filters_name).where(filters_year). order(session[:acuerdo_orden] + ' ' + session[:acuerdo_asc_desc]). paginate(page: (params[:format]=='xls' ? nil : params[:page]), per_page: (params[:format_xlsx_count] || session[:por_pagina]) ) </code></pre> Las diferentes versiones de un acuerdo aparecen mediante esta acción del controlador AcuerdoController: <pre><code class="ruby"> def versiones @acuerdo = Acuerdo.find_by_id params[:id] versiones = @acuerdo.acuerdo_datos.order('created_at DESC') # Le quitamos la ultima version @versiones = versiones.to_ary - [versiones.first] render(:update) do |page| page.replace_html params[:update], partial: 'versiones' end end </code></pre> Función del modelo Acuerdo donde se crea una nueva versión del acuerdo al pasar a un metaestado 'firmado' desde un metaestado 'definicion': <pre><code class="ruby"> def crear_nueva_version antigua_version = ultimos_datos nueva_version = antigua_version.dup nueva_version.save antigua_version.update_attribute :acuerdo_actual, false nueva_version.update_attribute :acuerdo_actual, true antigua_version.acuerdos_contraparte.each do |contraparte| nueva = contraparte.dup nueva.acuerdo_datos_id = nueva_version.id nueva.save end antigua_version.acuerdos_aportacion.each do |aportacion| nueva = aportacion.dup nueva.acuerdo_datos_id = nueva_version.id nueva.save end antigua_version.acuerdos_pago.each do |pago| nuevo = pago.dup nuevo.acuerdo_datos_id = nueva_version.id nuevo.save end antigua_version.acuerdos_area_actuacion.each do |area_actuacion| nueva = area_actuacion.dup nueva.acuerdo_datos_id = nueva_version.id nueva.save end antigua_version.acuerdos_pais.each do |pais| nuevo = pais.dup nuevo.acuerdo_datos_id = nueva_version.id nuevo.save end end </code></pre> Diagrama de clases desde la perspectiva de la entidad Acuerdo: !DiagramaClasesPerspectivaAcuerdo.png! h1. Pruebas Versión antes de modificación KO al buscar Acuerdo por nombre " CONVENIO ESPECÍFICO DE COLABORACION INTERINSTITUCIONAL ENTRE MINERD Y LA OEI": KO: !VersionesAcuerdoKO.png! Versión después de modificación OK al buscar Acuerdo por nombre " CONVENIO ESPECÍFICO DE COLABORACION INTERINSTITUCIONAL ENTRE MINERD Y LA OEI": OK: !VersionesAcuerdoOK.png!