Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/63.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/270.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接受嵌套属性唯一性验证_Ruby On Rails_Accepts Nested Attributes - Fatal编程技术网

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