ActiveRecord关系一对一属于rails

时间:2014-10-06 16:41:54

标签: ruby-on-rails ruby activerecord

考虑以下情况。我想限制用户最多只有一个地址,所以我的目标是在地址表集中最多只有一个外键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

创建地址关系的第一种方式(用户没有地址关系):

  1. user实例上调用create_address_relation。地址关系被创建了,太棒了!
  2. 在已具有地址关系的user实例上调用create_address_relation。另一个地址被创建,不是那么好!我想知道我在验证方面做错了什么
  3. 创建地址关系的第二种方式(用户没有地址关系):

    1. user实例上调用create_address_relation。地址关系被创建了,太棒了!
    2. 在已具有地址关系的user实例上调用create_address_relation。这是奇怪的位,当前地址deleted_at字段设置为true。现在用户没有地址关系。
    3. 我在这里做错了什么?确保每个地址最多只有一个用户的正确方法是什么?

      更新 我可以在地址表中的user_id上添加唯一索引,或者我可以在代码中手动检查地址是否存在不创建另一个地址记录。

      它没有验证那么干净整洁,所以我更喜欢这个解决方案,但是现在我得到了临时解决方案。

0 个答案:

没有答案