Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 两个Rails模型之间的关联,允许使用validates\u关联验证自身_Ruby On Rails_Ruby On Rails 3_Validation - Fatal编程技术网

Ruby on rails 两个Rails模型之间的关联,允许使用validates\u关联验证自身

Ruby on rails 两个Rails模型之间的关联,允许使用validates\u关联验证自身,ruby-on-rails,ruby-on-rails-3,validation,Ruby On Rails,Ruby On Rails 3,Validation,使用Rails 3.2,不确定这是否会产生影响 车主拥有许多自行车 我想根据Owner模型中bicycle\u limit字段的值,对车主可以拥有的自行车数量进行限制,该字段存储了该车主的允许限制 现在,我希望在验证/保存自行车或所有者时运行限制自行车所有权验证(稍后我将限制它)。为此,我将validates_associated::owner放在Bicycle模型上 class Owner < ActiveRecord::Base has_many :bicycles, inverse

使用Rails 3.2,不确定这是否会产生影响

车主拥有许多自行车

我想根据
Owner
模型中
bicycle\u limit
字段的值,对
车主可以拥有的
自行车数量进行限制,该字段存储了该车主的允许限制

现在,我希望在验证/保存
自行车
所有者
时运行
限制自行车所有权
验证(稍后我将限制它)。为此,我将
validates_associated::owner
放在
Bicycle
模型上

class Owner < ActiveRecord::Base
 has_many :bicycles, inverse_of: :owner

 validate :limit_bicycle_ownership

 def limit_bicycle_ownership
   if bicycles(:reload).size > bicycle_limit
     errors.add(:bicycles, "^Too many bicycles")
   end
 end
end

class Bicycle < ActiveRecord::Base
  belongs_to :owner, inverse_of: :bicycles

  validates_presence :owner
  validates_associated: :owner
end
但是,当通过
自行车
模型的实例更改所有权时,验证似乎不起作用:

owner = Owner.create(bicycle_limit: 1)

bicycle1 = Bicycle.new(owner_id: owner.id)
bicycle1.valid? # true
owner.valid? # true
bicycle1.save! # true

bicycle2 = Bicycle.new(owner_id: owner.id)
bicycle2.valid? # true
owner.valid? # true
bicycle2.save! # true, but I was expecting this to fail
owner.valid? # false
我已经窥探了
限制自行车所有权
验证,据我所知,这是自行车2.save时的过程!正在运行:

  • bicycle2
    充分了解其与
    owner
    的新关联,可以通过
    validates\u关联:owner
    回调对其进行验证
  • owner
    但是,似乎不了解导致其被验证的关联,并且
    bicycles(:reload)
    仅返回与
    bicycle1的现有关联
  • 然后,对
    所有者
    的验证通过,因为就
    所有者
    而言,它只拥有一辆自行车(
    bicycle1
    ),该自行车不超过其
    bicycle\u限制
  • bicycle2
    然后继续验证和保存,并成功保存,使车主拥有两辆自行车

因此,基本上,当设置或更新自行车的所有者时,其新所有者甚至不知道自行车是否存在,直到自行车完成保存,此时执行
验证\u相关的
调用为时已晚。有没有更好的方法可以做到这一点,而不必从
Bicycle
模型中的
Owner
模型复制验证逻辑?我觉得可能有一个解决方案涉及
自行车
模型上的
保存后的
回调,但我真的不知道从哪里开始。

我认为当bycicle添加到owner时,您可以启动一个事务,如果添加owner后,owner未生效,则回滚:

Bicycle.transaction do
  bicycle2 = Bicycle.new(owner_id: owner.id)
  bicycle2.valid? # true
  owner.valid? # true
  bicycle2.save!

  if !owner.valid?
   raise ActiveRecord::Rollback, "Error message..."
  end
end
Bicycle.transaction do
  bicycle2 = Bicycle.new(owner_id: owner.id)
  bicycle2.valid? # true
  owner.valid? # true
  bicycle2.save!

  if !owner.valid?
   raise ActiveRecord::Rollback, "Error message..."
  end
end