2012-08-26 11 views
5

Tengo dos modelos ActiveRecord:Asociación privada en los carriles

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

class Bar < ActiveRecord::Base 
    belongs_to :foo 
end 

mi diseño dicta que Bar necesidades a estar asociados a Foo, pero Foo se asocia únicamente a Bar para la dependencia de la base de datos - para asegurarse de que cuando se elimina una instancia de Foo, todas las instancias asociadas de Bar también se eliminarán. Aparte de eso, el código que usa Foo no debe saber acerca de Bar, y no quiero que los métodos de asociación sean accesibles desde los objetos Foo.

He intentado declarar private antes de la declaración has_many en Foo, pero no funciona (supongo que sólo funciona para los métodos declarados directamente con def ...).

¿Hay alguna forma de hacer que la asociación sea privada o de lograr la dependencia de la base de datos sin crear una asociación Bar en Foo?

Respuesta

11

usted debe poner la declaración private después de llamar has_many, ya que no es hasta entonces que se definen los métodos para la asociación:

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

Gracias! También hice 'bar_ids' y' bar_ids = 'private - no tan importante como hacer que' bars' y 'bars =' sean privados, pero debe tenerse en cuenta por la integridad de la solución. –

Cuestiones relacionadas