Múltiples tipos de documentos en un solo modelo

Hi guys,

Consideren por favor los siguientes modelos :

class Concepto < ActiveRecord::Base

has_many :movtos

end

class Movto < ActiveRecord::Base

belongs_to :concepto
has_many :movto_items

end

class MovtoItem < ActiveRecord::Base

belongs_to :movto

end

El modelo Movto deberá tener un atributo folio por cada concepto, este
folio se deberá generar automaticamente de forma consecutiva :

#Concepto :

id descrip
1 compra
2 salida
3 devolucion

#Movto :

id concepto_id folio
1 1 1
2 1 2
3 1 3
4 2 1
5 2 2
6 3 1

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.

La pregunta aqui: Es la manera Rails de manejarlo en estos tiempos ??
Por favor muchachos arrojenme un poco de luz, lo tomaré cómo un regalo
de navidad -:slight_smile:

Gracias … saludos

Jaime Mora R.

Fe de errata !

el contador y asignarselo al atributo concepto_id, claro esto se podría

Quise decir “y asignarselo al atributo folio”

Gracias … saludos

Jaime Mora R.

Jaime Mora R. wrote:

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

end

[1] http://wiki.rubyonrails.org/rails/pages/MagicFieldNames
[2]
Peak Obsession

Saludos.

Jaime Mora R.