From bc83b7a6c7856abf16817928edbdae3eb083ee13 Mon Sep 17 00:00:00 2001 From: fauno Date: Sun, 21 Apr 2019 01:02:11 -0300 Subject: [PATCH] ver las ultimas posiciones closes #6 --- app/models/posicion.rb | 11 ++++++ app/views/consensos/_consenso.json.jbuilder | 6 +++- app/views/consensos/index.json.jbuilder | 3 +- test/controllers/consensos_controller_test.rb | 36 ++++++++++++++++++- test/models/posicion_test.rb | 21 +++++++++++ 5 files changed, 74 insertions(+), 3 deletions(-) diff --git a/app/models/posicion.rb b/app/models/posicion.rb index 7d60042..4285d5a 100644 --- a/app/models/posicion.rb +++ b/app/models/posicion.rb @@ -16,4 +16,15 @@ class Posicion < ApplicationRecord # Solo puede tener alguno de los estados definidos validates :estado, inclusion: { in: Posicion::ESTADOS } + + # Obtener las Ășltimas posiciones por cada pirata. Para no hacer + # consultas complejas, obtenemos primero los IDs de las posiciones y + # luego traemos solo esas. + scope :ultimas, lambda { + ids = select('id, max(created_at) as created_at') + .group(:pirata_id) + .collect(&:id) + + where(id: ids) + } end diff --git a/app/views/consensos/_consenso.json.jbuilder b/app/views/consensos/_consenso.json.jbuilder index 2847808..31c55c3 100644 --- a/app/views/consensos/_consenso.json.jbuilder +++ b/app/views/consensos/_consenso.json.jbuilder @@ -2,4 +2,8 @@ json.call(consenso, :id, :created_at, :titulo, :texto) -json.posiciones consenso.posiciones, partial: 'posiciones/posicion', as: :posicion +ultimas ||= false +posiciones = consenso.posiciones +posiciones = posiciones.ultimas if ultimas + +json.posiciones posiciones, partial: 'posiciones/posicion', as: :posicion diff --git a/app/views/consensos/index.json.jbuilder b/app/views/consensos/index.json.jbuilder index a4c24ba..d8ff84e 100644 --- a/app/views/consensos/index.json.jbuilder +++ b/app/views/consensos/index.json.jbuilder @@ -1,3 +1,4 @@ # frozen_string_literal: true -json.consensos @consensos, partial: 'consensos/consenso', as: :consenso +json.consensos @consensos, partial: 'consensos/consenso', as: :consenso, + locals: { ultimas: true } diff --git a/test/controllers/consensos_controller_test.rb b/test/controllers/consensos_controller_test.rb index 4290c34..bb29b72 100644 --- a/test/controllers/consensos_controller_test.rb +++ b/test/controllers/consensos_controller_test.rb @@ -8,7 +8,9 @@ class ConsensosControllerTest < ActionDispatch::IntegrationTest end test 'se pueden mostrar' do - 2.times { create :consenso } + 2.times do + create :consenso + end get consensos_url, as: :json, headers: @auth body = JSON.parse(@response.body) @@ -17,6 +19,24 @@ class ConsensosControllerTest < ActionDispatch::IntegrationTest assert_equal 2, body['consensos'].size end + test 'al mostrar solo se ven las posiciones resumidas' do + 2.times do + consenso = create :consenso + pirata = create :pirata + + 3.times do + create :posicion, consenso: consenso, pirata: pirata + end + end + + get consensos_url, as: :json, headers: @auth + body = JSON.parse(@response.body) + + body['consensos'].each do |consenso| + assert_equal 1, consenso['posiciones'].count + end + end + test 'se puede ver uno solo' do consenso = create :consenso, con_posiciones: 2 @@ -28,6 +48,20 @@ class ConsensosControllerTest < ActionDispatch::IntegrationTest assert_equal 2, body['posiciones'].size end + test 'al ver uno solo se ve todo el historial de posiciones' do + consenso = create :consenso + pirata = create :pirata + + 3.times do + create :posicion, consenso: consenso, pirata: pirata + end + + get consenso_url(consenso), as: :json, headers: @auth + body = JSON.parse(@response.body) + + assert_equal 3, body['posiciones'].size + end + test 'se pueden crear' do post consensos_url, as: :json, headers: @auth, params: { consenso: { diff --git a/test/models/posicion_test.rb b/test/models/posicion_test.rb index 1906894..83b3cfc 100644 --- a/test/models/posicion_test.rb +++ b/test/models/posicion_test.rb @@ -8,4 +8,25 @@ class PosicionTest < ActiveSupport::TestCase assert_equal true, posicion.valid? end + + test 'se pueden saber las Ășltimas' do + consenso = create :consenso + piratas = [] + 2.times do + piratas.push create :pirata + end + + 5.times do + create :posicion, + pirata: piratas.sample, + consenso: consenso, + created_at: (1..100).to_a.sample.days.ago + end + + posicion1 = create :posicion, pirata: piratas.first, consenso: consenso + posicion2 = create :posicion, pirata: piratas.last, consenso: consenso + + assert_equal [posicion1.id, posicion2.id].sort, + consenso.posiciones.ultimas.collect(&:id).sort + end end