rails有一个通过关联

时间:2012-11-22 07:22:41

标签: ruby-on-rails-3 associations

我有一个包含字段名称和性别的用户模型。并且用户可以与另一个用户建立称为“配偶”的一对一关联,该关联必须在男性用户和女性用户之间。

railscasts self-referential-association的帮助下,我创建了这样的基本关联,

class User < ActiveRecord::Base
  has_one :spouse_list
  has_one :spouse, :through => :spouse_list

  has_one :inverse_spouse_list, :class_name => "SpouseList", :foreign_key => "spouse_id"
  has_one :inverse_spouse, :through => :inverse_spouse_list, :source => :user
end

class SpouseList < ActiveRecord::Base  
  belongs_to :spouse, :class_name => "User"  
  belongs_to :user  
end

SpouseList包含字段:spouse_id,:user_id,

上面的关联可以为单个用户创建许多行,如果访问配偶由@ user.spouse_list.spouse.name

显示第一行

如何限制男性用户和女性用户?

1 个答案:

答案 0 :(得分:1)

最后我为以下条件做了一对一的自我关联,

“用户可以与另一个用户建立称为”配偶“的一对一关联,该关联必须在男性用户和女性用户之间”

将字段spouse_id添加到用户模型并创建自定义验证的自关联

class User < ActiveRecord::Base

  belongs_to :spouse, :class_name => 'User', :inverse_of => :base_user, :foreign_key => "spouse_id"
  has_one :base_user, :class_name => 'User', :inverse_of => :spouse

  validate :validate_spouse_gender

  private
  def validate_spouse_gender
    errors.add(:spouse_id, 'could not be with same sex') if spouse && spouse.sex == sex
  end

end

现在男性用户A只能与另一个用户B作为配偶关联,如果B是性别女性。

希望它对某人有所帮助。