gpt4 book ai didi

ruby-on-rails - Rails - 使用父级的作用域父级验证嵌套属性的唯一性

转载 作者:行者123 更新时间:2023-12-01 07:26:15 25 4
gpt4 key购买 nike

我在 Rails 中对具有父级的嵌套属性的范围唯一性验证有问题。

背景

我有一个带有 3 个模型的 rails 4 应用程序:

#app/models/account.rb
class Account < ActiveRecord::Base
has_many :contacts, dependent: :destroy
end

#app/models/contact.rb
class Contact < ActiveRecord::Base
belongs_to :account
has_many :email_addresses, dependent: :destroy, validate: :true, inverse_of: :contact
accepts_nested_attributes_for :email_addresses,allow_destroy: true
validates :email_addresses, presence: true
end

#app/models/email_address.rb
class EmailAddress < ActiveRecord::Base
belongs_to :contact, inverse_of: :email_addresses

validates :label, presence: true
validates :contact, presence: true
validates :email, uniqueness: true, presence: true
validates_email_format_of :email
end

问题

我想做一个范围, 以确保属性 :email 型号 EmailAddress 在帐户级别是唯一的 (帐户是 Contact 的父级,而 Contact 本身是 EmailAddress 的父级)。

正如 http://guides.rubyonrails.org/active_record_validations.html 所建议的, 我试过 :
 class EmailAddress  < ActiveRecord::Base
belongs_to :contact, inverse_of: :email_addresses

validates :label, presence: true
validates :contact, presence: true
validates :email, presence: true, uniqueness: { scope: :account,
message: "This contact email is already taken" }
validates_email_format_of :email
end

这会引发错误“列 email_addresses.account 不存在”
我该怎么办 ?

谢谢你的帮助!

最佳答案

下面描述了在性能方面的更好选择。它经过测试并且工作正常。

为什么?

当大量电子邮件处于危险之中时,映射电子邮件会消耗大量资源,因此最好直接使用数据库执行范围。

如何?

兑现 EmailAddress 模型中的 account_id 并执行 before 验证方法。

1)创建迁移:

change_table :email_addresses do |t|
t.references :account, index: true
end
add_index :email_addresses, [:account_id, :email], unique: true

2) 迁移

3) 更新 EmailAddress 模型
#app/models/email_address.rb

class EmailAddress < ActiveRecord::Base
belongs_to :contact, inverse_of: :email_addresses
belongs_to :account

validates :label, presence: true
validates :contact, presence: true
validates_email_format_of :email
validates_uniqueness_of :email, allow_blank: false, scope: :account

before_validation do
self.account = contact.account if contact
end

end

关于ruby-on-rails - Rails - 使用父级的作用域父级验证嵌套属性的唯一性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24416599/

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