Rails - 使用关联强制执行二分法

时间:2012-05-08 04:39:21

标签: ruby-on-rails activerecord

我有一个带有标准字段的Devise用户模型。用户可以拥有个人资料或房屋,但不能同时拥有。

class User < ActiveRecord::Base

  attr_accessible ..... :profile_type
  has_one :profile, :dependent => :destroy
  has_one :house, :dependent => :destroy

end

在当前状态下,用户可以同时拥有个人资料和状态。假设:User.first.profile返回配置文件。然后我可以做User.first.house,返回nil。这似乎不太好 - 事实上,我似乎将在以后遇到无效的数据问题。

编辑:这是针对某种情况,人们正在寻找住宿地点,或者他们有住宿的地方。所以我有两个类别的用户,一个人可以。这两个类别非常不同(即,寻找住宿地点的人与有住处的人有不同的领域。)

无论如何都要执行这种“任何一种”的关系?对Rails来说,我对你很陌生。

1 个答案:

答案 0 :(得分:1)

您可以使用自定义验证来处理此问题 -

validate :has_either_profile_or_house_but_not_both

private

def has_either_profile_or_house_but_not_both
  if profile.present? && house.present?
    errors[:base] << "User can have either a profile or house, but not both."
  end
end

有可能通过软件设计更清洁的方式来做到这一点,但如果不知道你正在解决的问题,这是我的最佳建议。