2016-04-14 12 views
1

私は、各ユーザが多くのアイテムを持ち、各アイテムが多くのユーザを持つケースがあります。 ただし、各ユーザーにプライマリアイテムを割り当てたいとします。私はこれを達成するために最善のアーキテクチャ上の決定が何であるかを理解できません。最後に私は電話することができるようにしたい:Ruby on Rails同じモデルの複数の関連

User.primary_item 
+2

あなたが編集する前にあなたの協会は働くことができると思います。 ':foreign_key'は' has_one'でサポートされています。 http://guides.rubyonrails.org/association_basics.html#options-for-has-one つまり、アイテムに所有者が1人しかいない場合です。複数の人が主なアイテムと同じアイテムを持つことができれば、アソシエーションは別の方法に進むべきかもしれません。 –

+0

has_oneでは、usersテーブルではなくitemsテーブルのforeign_keyが検索されますか? belongs_toは良くなるのだろうか? – rantingsonrails

+1

はい、多くのユーザが同じプライマリアイテムを持つことができるが、1人のユーザがそのようなプライマリアイテムを1つしか持てないという関係がある場合、ユーザには 'primary_item_id'を、ユーザには' belongs_to'を設定することができます。 –

答えて

2

これはhas_many_throughの関係のように聞こえる。

class User 
    has_many :owned_items 
    has_many :items, through :owned_items 
end 

class Item 
    has_many :owned_items 
    has_many :users, through :owned_items 
end 

class OwnedItem 
    belongs_to :items 
    belongs_to :users 
end 

primary_itemとは別の関係を持つのではなく、owned_itemにプライマリ属性を設定できます。

+1

それは新しいテーブルを必要とするでしょうか?次の方が簡単だろうか? ":foreign_key =>" primary_item_id " – rantingsonrails

+0

@rantingsonrails、':foreign_key'を追加すると、Railsの規約に反します。私は、Railsの慣習と戦うよりもはるかに簡単な新しいテーブルを追加しています。 – John

+1

あなたの質問には、 "各ユーザーには多くのアイテムがあり、各アイテムには多数のユーザーがいる"という質問があります。そのhas_many_throughまたはhas_many_and_belongs_toのいずれかの関係。私はあなたのアプリを開発すると、has_many_throughが多くのメリットをもたらすことがわかります。 – margo

0

上記の情報に基づいて、両方のモデルでhas_many through:の関連付けを設定するとします。 Userモデルでは、primary_item_idの列を追加し、Userprimary_itemモデルにscopeを追加して、そのユーザーのプライマリアイテムを取得します。 has_many through:の関連付けでは、関連する結合テーブルUserItemsも作成する必要があります。

class User < ActiveRecord::Base 
    has_many :user_items 
    has_many :items, through: :user_items 
    scope :primary_item, -> { Item.find(self.primary_item_id) } 
end 

class UserItem < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :item 
end 

class Item < ActiveRecord::Base 
    has_many :user_items 
    has_many :users, through: :user_items 
end 

これはActiveRecordモデルの関連情報です。また、移行を実行してUserItemsテーブルを作成し、Usersテーブルにprimary_item_id列を追加する必要があります。どこにでも:foreign_keyを使用していないことに注意してください。

+0

彼はたくさんのアイテムと1つのユーザーアイテムを望んでいます。私はあなたが必要と思うのは、Itemsテーブルのレコードを指すユーザテーブルのフィールドです。別のテーブルは必要ありません。 – Kalman

+0

@カルマン、あなたは間違っています。彼の質問から引用したように、「各ユーザーには多くのアイテムがあり、各アイテムには多くのユーザーがいる」というケースがあります。*多対多の関係です。彼はまた、各ユーザーにプライマリアイテムを割り当てたいと思っています。* – John

+0

これは正しいです。ユーザとアイテムは、互いに多対多です。ユーザーALSOは、彼の主要な項目にハッシュを持っています。 – Kalman

関連する問題