2012-08-26 13 views
5

Ho due modelli ActiveRecord:associazione privata a rotaie

class Foo < ActiveRecord::Base 
    has_many :bars,:dependent=>:destroy 
end 

class Bar < ActiveRecord::Base 
    belongs_to :foo 
end 

Il mio progetto impone che Bar deve essere associato a Foo, ma Foo è associato solo al Bar per la dipendenza del database - fare in modo che quando un'istanza di viene eliminata, verranno eliminate anche tutte le istanze associate di Bar. A parte questo, il codice che utilizza Foo non dovrebbe conoscere Bar e non voglio che i metodi di associazione siano accessibili dagli oggetti .

Ho provato dichiarando private prima della dichiarazione has_many in Foo, ma non funziona (credo che funziona solo per i metodi dichiarati direttamente con def ...).

Esiste un modo per rendere privata l'associazione o per ottenere la dipendenza del database senza creare un'associazione Bar in Foo?

risposta

11

si deve mettere la dichiarazione privatedopo si chiama has_many, in quanto non è fino a quel momento che i metodi per l'associazione sono definite:

class Foo < ActiveRecord::Base 
    has_many :bars, :dependent => :destroy 
    private :bars, :bars= 
end 

Foo.first.bars 
#=> #<NoMethodError: private method `registrations' called for #<Foo:0x007fc767adca88>> 
+1

Grazie! Ho anche creato 'bar_ids' e' bar_ids = 'private - non importa quanto fare' bar' e 'bars =' private, ma dovrebbe essere notato per la completezza della soluzione. –

Problemi correlati