Comportamento inatteso di validates_associated (bug? capito

Stavo scrivendo un po’ di codice di test, quando mi sono accorto che
validates_associated lasciava passare un sacco di roba che invece
avrebbe dovuto bloccare (secondo me).

Quale è l’arcano? facciamoci un semplice esempio:

class B < ActiveRecord::Base
belongs_to :a

validates_presence_of :a_id
validates_associated :a
end

class A < ActiveRecord::Base
has_many :b
end

Supponiamo che non abbiamo nessun oggetto A con id superiore a 10.
Questo codice inserirà nel DB l’oggetto creato:

b = B.create(:a_id=>0)

Questo pure

b = B.create(:a_id=>99)

Quale è l’arcano?

In sostanza validates_associated manda a b.a il messaggio nil? e in caso
contrario valid?. Solo che b.a è nil, in quanto non gli ho passato
alcunchè come :a, ma solo come :a_id).

Lo stesso codice se ho implementato le foreign keys lato DB da
chiaramente errore (come mi aspettavo). Se questo non è molto grave, nel
caso in cui abbia un rapporto “molti a molti” attraverso dei through, si
ottengono risultati assurdi (posso fare esempio, ma direi che si riesce
a capire dove sia il problema).

Come dire… probabilmente la mia illusione che potessi gestire tutto da
rails senza scendere a codice db specifico era vana. La cosa confesso
che mi secca tantissimo, anche se in effetti il mio è un uso un po’
improprio del tutto (ma uso che tuttavia di tanto in tanto potrebbe
venire comodo). Soprattutto io non ho letto da nessuna parte che non si
possa fare, anche se il metodo consigliato è chiaramente

B.create(:a=>…)


blog: http://www.akropolix.net/rik0/blogs | Enrico F.
site: http://www.akropolix.net/rik0/ | RiK0
forum: http://www.akropolix.net/forum/ | Linux Counter: #299198