5

tengo 2 modelos, como por ejemplo:rieles has_many, construir, inverse_of

class User < ActiveRecord::Base 
    has_many :user_services, :inverse_of => :user 

    validates_length_of :user_services, :maximum => 3 
end 

class UserService < ActiveRecord::Base 
    belongs_to :user, :inverse_of => :user_services 

    validates_associated :user 
end 

me gustaría hacer algo como:

user_service = user.user_services.build(...) 
if user_service.save 
... 

pero lanza un "nivel de pila demasiado profundo" de error. Supongo que debido a validates_associated combinado con el inverso_of. ¿Alguien sabe por qué pasa esto?

Llamar guardar directamente en el objeto de usuario en lugar de que el objeto user_service parece funcionar, pero me pregunto si hay una manera de lograr esto al revés.

Gracias!

Respuesta

3

Esto sucede porque su valida tiene una dependencia circular.

validates_length_of :user_services 
validates_associated :user 

http://api.rubyonrails.org/classes/ActiveRecord/Validations/ClassMethods.html#method-i-validates_associated

ACTUALIZACIÓN

Puede eliminar dependencia circular si se vuelve a escribir el código de la siguiente manera:

class User < ActiveRecord::Base 
    has_many :user_services, :inverse_of => :user 
    validates_length_of :user_services, :maximum => 3 
end 

class UserService < ActiveRecord::Base 
    belongs_to :user, :inverse_of => :user_services 

    def user_services_amount 
    return 0 if self.user.nil? 
    self.user.user_services.length 
    end 

    validates :user_services_amount, :inclusion => { :in => 0..3 } 
end 
+0

Gracias! Sí, parece estar de alguna manera conectado con este problema que encontré: https://rails.lighthouseapp.com/projects/8994/tickets/5454-use-validates_associated-with-reverse_of-cause-infinite-loop – joelmats

+0

Añadir solución a esto problema circular – Sector

+0

Buena solución. Pero parece que se necesita _Removear número mágico refactoring_: puedes mover la magia ** 3 ** de todas las verificaciones con el método 'User.max_services_allowed'. –

Cuestiones relacionadas