実際には、所有者とバッジのモデルに多対多の関連付けが必要です。したがって、オプションを使用has many :through
または使用する必要がありますhas_and_belongs_to_many
。2 つの違いについては、こちらを参照してください。の例を挙げていhas_many :through
ます。
3 つのモデルを作成する必要があります。
class Holder < ActiveRecord:Base
has_many :badges_holders
has_many :badges, :through => :badges_holders
end
class Badge < ActiveRecord:Base
has_many :badges_holders
has_many :holders, :through => :badges_holders
end
class BadgesHolder < ActiveRecord:Base
belongs :badge
belongs :holder
end
また、移行ファイルは次のようにする必要があります。
create_table "holders", :force => true do |t|
t.string "faceid"
t.timestamps
end
add_index "holders", ["badges_id"], :name => "index_holders_on_badges_id"
create_table "badges", :force => true do |t|
t.string "name"
t.text "description"
t.timestamps
end
create_table "badges_holders", :force => true do |t|
t.integer "holder_id"
t.integer "badge_id"
t.timestamps
end
Holder.find_by_faceid('xyz').badges
これで、面が xyz である所有者が保持するすべてのヘッジを簡単に見つけることができます。そしてBadge.first.holders
、最初のベッドのすべてのホルダーを取得します。
あなたの質問では、結合テーブルに追加のフィールドが必要ないため、HABTM が適切なオプションになります。そのためhas_and_belongs_to_many
、両方のモデルで使用でき、その場合はモデルは必要ありませんBadgesHolder
。また、結合テーブルの移行では、最初の行を a に置き換えcreate_table "badges_holders", :id => false, :force => true do |t|
て削除t.timestamps
します。HABTM の結合テーブルには外部キー以外の列が含まれてはならないためです。