在rails中使用“couple”系统的最佳方法是什么?

时间:2011-08-13 21:01:59

标签: ruby-on-rails

我正在使用Rails 3.1编写一个RPG网站,我有一个用户模型(字段无关紧要)。

我需要的是能够与两个用户结婚,但我不知道协会的最佳方式是什么。

我认为user1和user2是列,但我不知道如何将它与User模型相关联以便知道用户是否已婚。 (也就是说,用户ID可以在一列或另一列......)

提前谢谢!

3 个答案:

答案 0 :(得分:3)

如果它始终是一对一的,你可以这样设置:

class User
  belongs_to :partner, :foreign_key => :partner_id, :class_name => 'User', :inverse_of => :partner
end

哪个也应该处理反向关系,例如

user_1.partner = user_2
user_2.partner # <user_1>

如果你需要Marriage作为一个班级,婚姻可以通过has_many与用户联系,并验证用户数是2(如果是传统婚姻)。例如。如果你去了STI路线:

class Marriage < ActiveRecord::Base
  has_many :users
end

class User < ActiveRecord::Base
  belongs_to :marriage
end

class TraditionalMarriage < Marriage
  validate do |record|
    if record.users.length != 2
      record.errors.add(:users, "Marriage is between 2 people!!")
    end
  end
end

class PartyTimeMarriage < Marriage
  validate do |record|
    if record.users.length < 3
      record.errors.add(:users, "A good marriage requires at least three spouses!!")
    end
  end
end

答案 1 :(得分:1)

某种形式的

has_one :wife, :class_name => "User"
belongs_to :husband, :class_name => "User"

应该适用于您的用户活动记录模型。也许对性别进行一些验证。

另一种解决方案是创建一个包含2个用户引用(has_one)的已婚表,以保存结婚日期和内容等其他数据。

答案 2 :(得分:1)

这是未经测试的,但值得尝试

class User < ActiveRecord::Base
    belongs_to :spouse, :class_name => "User", :foreign_key => 'spouse_id' 

    def get_married_to(user)
        self.spouse = user
        user.spouse = self
    end
end

u1 = User.new
u2 = User.new
u1.get_married_to(u2)    

还要查看导轨指南:http://guides.rubyonrails.org/association_basics.html