Rails自动保存会产生双重验证错误

时间:2015-07-14 08:51:41

标签: ruby-on-rails ruby-on-rails-4

我使用的是Rails 4.2。

我有四种模式:

class User < ActiveRecord::Base
  belongs_to :organization
  has_many :licenses
end

class License < ActiveRecord::Base
  belongs_to :user #, autosave: true
end

class Organization < ActiveRecord::Base
  has_many :users
end

class Application < ActiveRecord::Base
  has_many :licenses
end

然后我有代码看起来像这样为用户创建License

def user
  @_user ||= User.find(...)
end

def create_license
  license = License.find_or_initialize_by(application: @application, user: user)

  if license.user.organization.nil?
    license.user.organization = @organization
  end

  if license.user.organization == @organization
    license.expires_on = nil
    license.save
  else
    license.errors.add(:user, "User belongs to different organization")
  end

  license
end

此代码的问题在于,当我运行license.save时,它不会保存user对象,即组织未更改。

所以我将belongs_to :user, autosave: true添加到License类,以强制它保存用户。在这种情况下,这可以正常工作。

但是,如果我设置autosave选项并运行如下代码:

user = User.new
user.licenses.build(...)
user.save

用户对象每次都会获得两次验证错误。

我做的事情很奇怪吗?

2 个答案:

答案 0 :(得分:0)

您应该从belongs_to中删除autosave:true。 它也会自动保存许可证。 正如您添加了自动保存。它正在运行两次验证

答案 1 :(得分:0)

这是Rails中的一个错误,请参阅:https://github.com/rails/rails/issues/20874