Ruby on rails Rails接受嵌套属性唯一性验证
我有一个简单的表格,可以管理公司的职位。我使用Ruby on rails Rails接受嵌套属性唯一性验证,ruby-on-rails,accepts-nested-attributes,Ruby On Rails,Accepts Nested Attributes,我有一个简单的表格,可以管理公司的职位。我使用accepts\u nested\u attributesAPI来实现这一点。用户可以使用加号/减号按钮添加/删除位置,并为每个按钮选择用户和位置。我想强制执行的一个验证是,一个用户不能为同一家公司拥有多个职位。我这样做: class User < ActiveRecord::Base has_many :positions end class Position < ActiveRecord::Base belongs_to :
accepts\u nested\u attributes
API来实现这一点。用户可以使用加号/减号按钮添加/删除位置,并为每个按钮选择用户和位置。我想强制执行的一个验证是,一个用户不能为同一家公司拥有多个职位。我这样做:
class User < ActiveRecord::Base
has_many :positions
end
class Position < ActiveRecord::Base
belongs_to :user
belongs_to :company
validates :title, presence: true
validates :user, presence: true
validates :company, presence: :true
validates :user, uniqueness: { scope: :company }
end
class Company < ActiveRecord::Base
has_many :positions
accepts_nested_attributes_for :positions, allow_destroy: true
end
验证失败:职位用户为用户将职位复制到公司
我能做些什么来允许这样的更改而不导致分配验证失败(我也在数据库级别强制执行-这意味着这些操作会在服务器上引发5xx个错误)?虽然它不漂亮,但您可以潜在地覆盖
位置\u attributes=
来重新映射数据:
def positions_attributes=(attributes)
existing = Array(positions)
attributes.each do |iteration|
position = existing.find { |position| position.user_id.eql?(iteration[:user_id]) }
if position
attributes.select{ |iteration| iteration[:id].eql?(position.id) }.each{ |iteration| iteration.delete(:id) }
iteration[:id] = position.id
end
end
super attributes
end
虽然它并不漂亮,但您可以潜在地覆盖
位置\u属性=
以重新映射数据:
def positions_attributes=(attributes)
existing = Array(positions)
attributes.each do |iteration|
position = existing.find { |position| position.user_id.eql?(iteration[:user_id]) }
if position
attributes.select{ |iteration| iteration[:id].eql?(position.id) }.each{ |iteration| iteration.delete(:id) }
iteration[:id] = position.id
end
end
super attributes
end