validar has_many

25 views
Skip to first unread message

Pablo Rodriguez

unread,
Apr 4, 2012, 6:44:29 PM4/4/12
to rub...@googlegroups.com
Tengo una relacion de has_many entre dos entities

Digamos

Factura
  :has_many :lines
  :validate :validate_all

def validate_all
  if self.lines.empty?
    errors.add_to_base "debe haber al menos una linea"
  end
end

Esto funciona en el create, pero en el update no, en el update params viene con lines con "_destroy"=> "1", por lo que antes de grabar lines no esta vacio.

Cual es la forma correcta de hacer esta validación ?

Saludos y muchas gracias

Pablo

Nicolás Berger

unread,
Apr 4, 2012, 9:25:40 PM4/4/12
to rub...@googlegroups.com
Creo que lo podés resolver con lo siguiente:

class Factura
has_many :lines, :inverse_of => :factura
accepts_nested_attributes_for :lines

validates_length_of :lines, :minimum => 1, :too_short => "debe haber


al menos una linea"
end

class Line
belongs_to :factura, :inverse_of => :lines
end

Agregué el accepts_nested_attributes_for porque nombraste el
"_destroy", asumí que lo manejás con eso.
El inverse_of le da conocimiento al modelo de la relación inversa, con
eso te asegurás que la instancia de factura en alguno de los lines es
la misma instancia que contiene a dicho line.
Pero además, sumado al accepts_nested_attributes_for, estoy casi
seguro que te permite que la factura vea la colección de lines ya
actualizada durante la validación, por ejemplo si un line tenía
"_destroy", ese line no va a estar en la colección.
Si podés probalo y contanos cómo te fue.

Saludos

2012/4/4 Pablo Rodriguez <pablorod...@gmail.com>:

Reply all
Reply to author
Forward
0 new messages