Estoy pensando en resolverlo agregando un contador en el modelo
Concepto, y en cada acción create en el controlador Movto, incrementar
el contador y asignarselo al atributo concepto_id, claro esto se podrÃa
manejar con un callback. Estoy estudiando el help de MySQL, posiblemente
tenga un auto-incremental dependiendo el valor de una columna. El tema
de las vistas lo pienso resolver mediante un solo controlador
MovtosController con diferentes vistas dependiendo el concepto, haciendo
uso de partials y helpers según sea el caso.
El modelo Movto deberá tener un atributo folio por cada concepto, este
folio se deberá generar automaticamente de forma consecutiva :
Counter Cache [1],[2], es una pequeña maravilla. Bien, primeramente
definimos nuestro campo automágico movtos_count, en el modelo padre :
class CreateConceptos < ActiveRecord::Migration
def self.up
create_table :conceptos do |t|
t.column :nombre, :string, :limit => 30
t.column :movtos_count, :integer, :default => 0
end
end
def self.down
drop_table :conceptos
end
end
En el modelo Movto definimos el counter_cache mediante belongs_to :
class Movto < ActiveRecord::Base
belongs_to :concepto, :counter_cache => true
end
En la acción create recuperamos el último valor de movtos_count mediante
una lectura y escritura consistente utilizando transaction, lo
incrementamos en 1 y lo asignamos al atributo folio. Counter Cache se
encargará de incrementar y almacenar en el modelo Concepto movtos_count,
auto-magicamente. De esta manera tenemos un folio consecutivo en base al
concepto :
class MovtosController < ApplicationController
def create @movto = Movto.new(params[:movto])
begin
Movto.transaction do @movto.folio = Concepto.find(@movto.concepto_id).movtos_count +
1 @movto.save!
end
flash[:notice] = “El nuevo movimiento se guardó correctamente.”
redirect_to movtos_path
rescue
render :action => “new”
end
end