Rails has_many,build,inverse_of

joe*_*ats 5 activerecord ruby-on-rails associations has-many ruby-on-rails-3

我有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
Run Code Online (Sandbox Code Playgroud)

我想做的事情如下:

user_service = user.user_services.build(...)
if user_service.save
...
Run Code Online (Sandbox Code Playgroud)

但它会引发"堆栈级太深"的错误.我假设因为validates_associated与inverse_of结合.有谁知道为什么会这样?

直接在用户对象而不是user_service对象上调用save似乎可以工作,但我想知道是否有办法实现这些反向.

谢谢!

Sec*_*tor 3

发生这种情况是因为您的验证具有循环依赖性。

validates_length_of :user_services
validates_associated :user
Run Code Online (Sandbox Code Playgroud)

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

更新

如果您这样重写代码,则可以删除循环依赖:

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
Run Code Online (Sandbox Code Playgroud)