考虑以下情况。我想限制用户最多只有一个地址,所以我的目标是在地址表集中最多只有一个外键user_id。
用户有一个地址,反映了各自的模型:
class User < ActiveRecord::Base
has_one :address, dependent: :destroy
end
class Address < ActiveRecord::Base
belongs_to :user
validates :user, presence: true
validate :user_association
def user_association
unless Address.where(user_id: user.id).count == 0
errors.add(:user_id, 'Only one address per user')
end
end
end
我是从用户模型创建地址,这是位(第一种方式):
def create_address_relation
a = Address.create(address_type: @type.to_s, user_id: id)
self.address = a
end
第二种方式:
def create_address_relation
create_address(address_type: @type.to_s)
end
创建地址关系的第一种方式(用户没有地址关系):
user
实例上调用create_address_relation。地址关系被创建了,太棒了!user
实例上调用create_address_relation。另一个地址被创建,不是那么好!我想知道我在验证方面做错了什么创建地址关系的第二种方式(用户没有地址关系):
user
实例上调用create_address_relation。地址关系被创建了,太棒了!user
实例上调用create_address_relation。这是奇怪的位,当前地址deleted_at
字段设置为true。现在用户没有地址关系。我在这里做错了什么?确保每个地址最多只有一个用户的正确方法是什么?
更新 我可以在地址表中的user_id上添加唯一索引,或者我可以在代码中手动检查地址是否存在不创建另一个地址记录。
它没有验证那么干净整洁,所以我更喜欢这个解决方案,但是现在我得到了临时解决方案。