Validacion para asociaciones entre modelos

Hola,

He visto que rails no valida tal como yo esperaría. Por ejemplo, si
tengo los modelos Antenna, Area y Position, donde las posiciones se
agrupan en áreas, las antenas se encuentran en una área y cubren
determinadas posiciones. En modelo de las antenas quiero validar que
sólo las antenas instaladas en alguna área tengan asociadas posiciones,
es decir:

class Antenna < ActiveRecord::Base
belongs_to :area
has_and_belongs_to_many :positions

def validate
if area.nil? and positions.size > 0
errors.add(:positions, “The antenna must to…”)
end
end
end

Sin embargo lo que he obtenido es que si asocio una antena sin área con
una posición, a pesar de que se detecta el error, se guarda la
asociación. En efecto:

p = Position.find(68)
p.antennas = []
=> []

a = Antenna.find(:first, :conditions => “area_id is null”)
a.positions << p
a.save
=> false

p = Position.find(68)
p.antennas.size
=> 1

p.antennas[0].id
=> 13

a.id
=> 13

¿Hay alguna forma cómoda de hacer validaciones que impidan que se
guarden dichas asociaciones?

Saludos,
Daniel.

On 9/26/07, Daniel Hernández [email protected] wrote:

belongs_to :area
una posición, a pesar de que se detecta el error, se guarda la

p.antennas.size
Daniel.

La única manera que yo encontré de tratar algo parecido fueron las
transacciones:

Antenna.transaction do
a = Antenna.find(:first)
a.positions << p
a.save! # Importante el !
end # En este momento si han fallado las validaciones se deshace la
línea de la
posición.
Además fuera del bloque deberías capturar la excepción RecordInvalid y
actuar en consecuencia.

Bai.

El mié, 26-09-2007 a las 15:40 +0200, Daniel R. Troitiño
escribió:

Además fuera del bloque deberías capturar la excepción RecordInvalid y
actuar en consecuencia.

El problema es que ello obliga a modificar el código en muchas partes,
por ejemplo, en ActiveScaffold. Yo también había pensado en tratar las
asociaciones con transacciones y creo que Rails debería prohibir las
asociaciones no válidas por omisión.

Saludos,
Daniel.