2011-10-30 11 views
3

私はRail webappで作業しています。非常に基本的な情報(ID、ユーザー名とパスワード)とプロファイル(各ユーザーのプロファイルを含む)の2つのモデルUserがあります。 (主な理由は、定期的に呼び出される軽量ユーザーモデルと、不規則に呼び出される本格的なプロファイルを持つことです)。これらのモデルのそれぞれには、多くの子供がいます。レールにhas_one関係の代わりに同じキーを持つ2つのテーブル

今、自分のプライマリキーを持つプロファイルと、Userと一致する外部キーuser_idを持っています。

しかし、ユーザーモデルと同じキー(つまり、レコードが同じユーザーを参照する場合はProfile.id == User.id)を持つプロファイルモデルを用意する必要があるのだろうかと思います。これは利便性です。なぜなら、私がUserに属するオブジェクトを持っていれば、そのオブジェクトがProfileに属し、その逆になりたいからです。たとえば、ユーザーhas_manyとSpec has_manyの関係をChildModelに指定できます。彼らは同じキーを使用するので、ChildModelをSpecにマージする必要はありません。次に、Childオブジェクトに関連付けられたユーザーを探すためにProfileをUserに送ります。

何らかの理由で私がUserとSpecの主キーとの間に不一致があると、欠点があります。深刻な問題があります。

あなたはこの状況に対してどのような勧告をしますか?

ありがとうございます。

+0

上記の質問には、プロファイルと仕様は実際に同じモデルですか?別の言い方をすれば、プロファイル、ユーザー、仕様、および子の4つのモデルがありますか、またはプロファイル、ユーザー、および子の3つのモデルしかありませんか? –

+0

はい。私は私の質問の例を修正しました。さらに、プロファイルとユーザーは1対1の関係にあります。私は軽負荷のためにそれらを2つのモデルに分けるだけです。 – AdamNYC

答えて

0

を次のようにhas_one関係マッピングを使用することができ示唆していますProfileUserの間です。これは、has_onebelongs_to宣言を使用して作成できます。

class User < ActiveRecord::Base 
    has_one :profile 
end 

class Profile < ActiveRecord::Base 
    belongs_to :user 
end 

Railsの第4版でアジャイルウェブ開発で述べたように:重要なルールがあります

は、ここに示す:常に外部キーを含むテーブルのモデルがbelongs_to宣言を持っています。

+0

Railsではモデル名を単数形として扱いますが、データベース表は複数形です – MBO

+0

@MBO:あなたは正しいです。私はそれを後ろ向きに考えていた。ありがとう。 –

+0

こんにちはMatthew、これは私が今やっていることです。しかし、この方法の欠点は、Profileに属しているChildがあり、Childオブジェクトに関連付けられているユーザーを見つけ出す必要がある場合、Userに到達する前にProfileと最初にマージする必要があることです。 1つの余分なマージ・ステップが必要です(これらの2つのテーブルは大きくなります)。他の制約(フォームなど)が原因で、ユーザークラスに属する子クラスを割り当てることができません。 – AdamNYC

0

私はあなたが1対1の関係を使用しなければならないようですね

ユーザークラス

class User 
    has_one :profile, :dependent => :destroy # you probably want this on destroy 
end 

移行

create_table :users do |t| 
    t.string :username 
    t.string :password 
end 
create_table :profiles do |t| 
    t. integer :user_id 
    ... other attributes 
end 
関連する問題