0

だから私は2つのモデルを持っています:

create_table "holders", :force => true do |t|
 t.string   "faceid"
 t.integer  "badges_id"
 t.datetime "created_at", :null => false
 t.datetime "updated_at", :null => false
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.datetime "created_at",  :null => false
 t.datetime "updated_at",  :null => false
end

私は2つのことが必要です:

  1. 特定の faceid 所有者のすべてのバッジを取得するには

  2. 特定のバッジのすべての所有者を取得します。

私はその本当に初心者の質問を知っていますが、今まで参考文献を扱っていなかったので、文献からどのように接続するかを本当に理解していませんでした.

4

2 に答える 2

1

実際には、所有者とバッジのモデルに多対多の関連付けが必要です。したがって、オプションを使用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 の結合テーブルには外部キー以外の列が含まれてはならないためです。

于 2013-02-28T23:48:37.917 に答える
0

Ruby on Railsの場合は、2つのモデルが必要です。

class Holder < ActiveRecord:Base
  has_many :badges
end

class Badge < ActiveRecord:Base
  belongs_to :holder
end

呼び出されたエントリはテーブルに含まbadges_idれていてはなりません; 「バッジ」テーブルにholdersあるはずです。holder_id

次に、あなたは単に呼び出すことができます

Holder.find_by_faceid('foobar').badges

Badge.find(1337).holder

あなたのbadge缶が多くの所有者に属している場合、あなたはhas_and_belongs_to_many関係を書かなければなりません。

于 2013-02-28T17:11:50.050 に答える