Rails has_many, build, inverse_of - PullRequest
       20

Rails has_many, build, inverse_of

5 голосов
/ 19 апреля 2011

У меня есть 2 модели, такие как:

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

Я хотел бы сделать что-то вроде:

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

, но выдает ошибку «слишком большой уровень стека».Я предполагаю из-за validates_associated в сочетании с inverse_of.кто-нибудь знает, почему это произошло?

Кажется, что вызов save непосредственно для объекта пользователя, а не объекта user_service, работает, но мне интересно, есть ли способ добиться этого в обратном порядке.

Спасибо!

1 Ответ

3 голосов
/ 19 апреля 2011

Это происходит потому, что ваши валидаторы имеют круговую зависимость.

validates_length_of :user_services
validates_associated :user

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

UPDATE

Вы можете удалить циклическую зависимость, если переписали свой код следующим образом:

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
...