gpt4 book ai didi

ruby-on-rails - 当某些属性可能被标记为销毁时,对嵌套属性的唯一性进行 rails 验证

转载 作者:数据小太阳 更新时间:2023-10-29 07:19:55 24 4
gpt4 key购买 nike

我有以下(经过 sanitizer 的)模型:

 class Person < ActiveRecord::Base

attr_accessible :name, :first_name, :last_name, :age, :job_title, :salary, :ssn, :prison_convictions, :addresses_attributes

has_many :addresses, inverse_of: :person

accepts_nested_attributes_for :addresses, allow_destroy: true

end



class Address < ActiveRecord::Base

attr_accessible :zip_code, :street,:house_number,
:unique_per_person_government_id

belongs_to :person, inverse_of: :addresses

validates_uniqueness_of :unique_per_person_government_id, scope: :person_id
end

问题如下,

假设 Joe Shmoe 本人目前有两个地址

666 Foo Street, 12345,唯一 ID:“ABCDEFG”和777 Lucky Avenue,54321,唯一 ID:“GFEDCBA”

假设以下帖子来自表单:

 {:addresses_attributes =>
{ [0] => {:unique_per_person_government_id => “ABCDEFG”, :street=> “Foo Street”, :house_number => 666, :zip_code=>12345, _destroy => 1}
[1] => {:unique_per_person_government_id => “ABCDEFG”, :street=>”Bar Street”, :house_number => 888, :zip_code => 12345, _destroy => 0}
}

行为似乎是第二个(即新的)记录首先验证唯一性,验证失败。

我想要的行为是在进行任何进一步验证之前非常简单地删除所有 marked_for_destruction? 的元素。

如何以这种方式重新连接生命周期?有没有更好的方法来实现这一点?

谢谢!

最佳答案

我已经解决了这个问题:

class Person < ActiveRecord::Base
attr_accessible :name, :first_name, :last_name, :age, :job_title, :salary, :ssn, :prison_convictions, :addresses_attributes

has_many :addresses, inverse_of: :person

accepts_nested_attributes_for :addresses, allow_destroy: true

def validate_addresses
codes = {}
addresses.each do |a|
if codes.key?(a.unique_per_person_government_id) and not a.marked_for_destruction?
codes[a.unique_per_person_government_id] = codes[a.unique_per_person_government_id]+1
if codes[a.unique_per_person_government_id] > 1
return false
end
elsif not codes.key?(a.unique_per_person_government_id) and a.marked_for_destruction?
codes[a.code] = 0
elsif not codes.key?(a.unique_per_person_government_id) and not a.marked_for_destruction?
codes[dacode] = 1
end
end
return true
end
end


class Address < ActiveRecord::Base
before_save :validate_addresses

attr_accessible :zip_code, :street,:house_number, :unique_per_person_government_id

belongs_to :person, inverse_of: :addresses

validates_uniqueness_of :unique_per_person_government_id, scope: :person_id, unless: :skip_validation?

def skip_validation?
person.addresses.each do |a|
if unique_per_person_government_id == a.code and id != a.id
return false unless a.marked_for_destruction?
elsif id == a.id and a.marked_for_destruction?
return false
end
end
return true
end
end

从而加强唯一性,并防止地址无效的人保存但忽略标记为销毁的项目。如果有人有类似的问题并且有更好/算法上更简单/更易于阅读的解决方案,并且愿意分享它,那就太棒了:D

关于ruby-on-rails - 当某些属性可能被标记为销毁时,对嵌套属性的唯一性进行 rails 验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14534665/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com