2011-08-13 23 views
2

私はRails 3.1のRPG Webサイトをプログラミングしています。私はUserモデルを持っています(フィールドはあまり関係ありません)。"カップル"システムをレールで行う最良の方法は何ですか?

私が必要とするのは、2人のユーザーと結婚できることですが、私は団体にとって何が最善の方法であるかわかりません。

私はuser1とuser2を列として考えましたが、ユーザーが結婚しているかどうかを知るためにUserモデルに関連付けるときに、両方が同じであると言う方法がわかりません。 (すなわち、ユーザーIDは1つの列または他の列にある可能性があります)

ありがとうございます!

答えて

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 
+0

、これは動作しますが、あなたは、外部クラスとして 'Marriage'を失うことになります。結婚 'has_many'ユーザーの場合は、外部クラスとしての結婚はまだ有効ですが、その数は2であることを確認してください。 – numbers1311407

+1

+1初めて、私は逆、niceを見たことがあります - http://apidock.com/rails/ ActiveRecord/Associations/ClassMethods/belongs_to – house9

+0

+1。あなたのリファクタにSTIをうまく使ってください。 –

1

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

のいくつかの形式は、ユーザーのアクティブレコードモデルで動作するはずです。おそらく性別のいくつかの妥当性検証を打ち明けるでしょう。

もう1つの解決策は、2つのUser参照(has_one)を持つ既婚のテーブルを作成して、結婚の日付やものなどの追加データを保持することです。

+0

これはもちろん、同じ性別の結婚がこのファンタジー世界で禁止されていることを前提としています – numbers1311407

+0

ええ、私は外のテーブルが必要です;)(カップルや結婚などを保持するために...) – Cydonia7

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

関連する問題