私は、各ユーザが多くのアイテムを持ち、各アイテムが多くのユーザを持つケースがあります。 ただし、各ユーザーにプライマリアイテムを割り当てたいとします。私はこれを達成するために最善のアーキテクチャ上の決定が何であるかを理解できません。最後に私は電話することができるようにしたい:Ruby on Rails同じモデルの複数の関連
User.primary_item
私は、各ユーザが多くのアイテムを持ち、各アイテムが多くのユーザを持つケースがあります。 ただし、各ユーザーにプライマリアイテムを割り当てたいとします。私はこれを達成するために最善のアーキテクチャ上の決定が何であるかを理解できません。最後に私は電話することができるようにしたい:Ruby on Rails同じモデルの複数の関連
User.primary_item
これは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にプライマリ属性を設定できます。
それは新しいテーブルを必要とするでしょうか?次の方が簡単だろうか? ":foreign_key =>" primary_item_id " – rantingsonrails
@rantingsonrails、':foreign_key'を追加すると、Railsの規約に反します。私は、Railsの慣習と戦うよりもはるかに簡単な新しいテーブルを追加しています。 – John
あなたの質問には、 "各ユーザーには多くのアイテムがあり、各アイテムには多数のユーザーがいる"という質問があります。そのhas_many_throughまたはhas_many_and_belongs_toのいずれかの関係。私はあなたのアプリを開発すると、has_many_throughが多くのメリットをもたらすことがわかります。 – margo
上記の情報に基づいて、両方のモデルでhas_many through:
の関連付けを設定するとします。 User
モデルでは、primary_item_id
の列を追加し、User
primary_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
を使用していないことに注意してください。
彼はたくさんのアイテムと1つのユーザーアイテムを望んでいます。私はあなたが必要と思うのは、Itemsテーブルのレコードを指すユーザテーブルのフィールドです。別のテーブルは必要ありません。 – Kalman
@カルマン、あなたは間違っています。彼の質問から引用したように、「各ユーザーには多くのアイテムがあり、各アイテムには多くのユーザーがいる」というケースがあります。*多対多の関係です。彼はまた、各ユーザーにプライマリアイテムを割り当てたいと思っています。* – John
これは正しいです。ユーザとアイテムは、互いに多対多です。ユーザーALSOは、彼の主要な項目にハッシュを持っています。 – Kalman
あなたが編集する前にあなたの協会は働くことができると思います。 ':foreign_key'は' has_one'でサポートされています。 http://guides.rubyonrails.org/association_basics.html#options-for-has-one つまり、アイテムに所有者が1人しかいない場合です。複数の人が主なアイテムと同じアイテムを持つことができれば、アソシエーションは別の方法に進むべきかもしれません。 –
has_oneでは、usersテーブルではなくitemsテーブルのforeign_keyが検索されますか? belongs_toは良くなるのだろうか? – rantingsonrails
はい、多くのユーザが同じプライマリアイテムを持つことができるが、1人のユーザがそのようなプライマリアイテムを1つしか持てないという関係がある場合、ユーザには 'primary_item_id'を、ユーザには' belongs_to'を設定することができます。 –