Ruby on rails 两个Rails模型之间的关联,允许使用validates\u关联验证自身
使用Rails 3.2,不确定这是否会产生影响 车主拥有许多自行车 我想根据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
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