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