4

私を悩ませ、答える必要がある質問はほとんどありません。すべてが次のチュートリアルに関連しています2多対多

質問1

has_manyを使用する結合テーブルにはIDが必要ですか?またはIDを削除するためのベストプラクティス?インデックスを追加し、他の2つの主キーを使用して、一意にまとめて設定しますか?

質問2

テーブル作成の移行でどのように行うことができますか?

質問3

これらの関係モデルを実行し、データを更新した後。(データを保持するために)更新されるたびに新しいデータセットを作成したいと思います。コントローラーは、更新、新規、作成モデルでどのように見えますか?

質問4

真ん中のテーブルで、trueまたはfalseが表示されるような属性を設定したいのですが、3番目のテーブルだけでなく、2番目のテーブルの引数も設定するにはどうすればよいですか。

4

2 に答える 2

3

最初に...注意の言葉:そのrailscastは非常に古いです。そのエピソードには、新しいバージョンのレールによって日付が付けられた構文上のものがある可能性があります。

質問1

has_many throughメソッドを使用している場合は、本格的なモデルを使用しているため、結合モデルにid列が必要です。ライアンがエピソードで言及しているように、追加情報を追跡する必要がある場合は、この方法を選択します。has_and_belongs_to_manyメソッドを使用する場合、テーブルにid列はありません。 多対多の関連付けで重複を許可しないチェックを実現する場合(つまり、アイテムaとアイテムbのペアリングを許可し、アイテムaからアイテムbへの別のレコードを許可する)は、単純なものを使用できます。スコープで行を検証します:

validates_uniqueness_of :model_a_id, :scope => [:model_b_id]


質問2

このコードを使用して、移行にインデックスを追加できます

add_index :table_name, [ :join_a_id, :join_b_id ], :unique => true, :name => 'by_a_and_b'

これは、create_tableステートメントの下のchangeブロックに挿入されます(ただし、そのcreate_tableブロックには挿入されません)。詳細については、この質問を確認してください。結合テーブルで、Railsに複合キーがない場合の最善の回避策は何ですか?

質問3

何を達成しようとしているのか完全にはわかりませんが、新しいレコードが結合モデルに挿入されるたびに何らかのアクションを実行したい場合は、after_createアクティブレコードフックを使用します。それはこのようになります。

class YourJoinModel < ActiveRecord::Base

  after_create :do_something

  def do_something
    puts "hello world"
  end
end

その関数do_somethingは、新しいレコードが作成されるたびに呼び出されます。

質問4

has_many throughメソッドを使用すると、関係の両側でそのモデルで定義した追加の属性にアクセスできます。たとえば、次の設定がある場合:

class Factory < ActiveRecord::Base
  has_many :widgets, :through => :showcases
end

class Widget < ActiveRecord::Base
  has_many :factories, :through => :showcases
end

class Showcases < ActiveRecord::Base
  belongs_to :factory
  belongs_to :widget

  attr_accessiable :factory_id, :widget_id, :visible
end

あなたは次のようなことを言うことができます

widget = Widget.first
shown = widget.showcases
shown.first.visible

また

shown = widget.showcases.where( :visible=> true )

他の協会に連絡することもできます。

shown.first.factory
于 2012-07-30T15:30:58.583 に答える
0

アソシエーションに列がある理由は、idその特定のアソシエーションを、それが持つ関係に関係なく削除する方法を提供するためです。その識別子がないと、すべての外部キーを指定する以外に関連付けを定義するのは困難です。

キーに2つのコンポーネントしかないという些細なケースの場合、これはそれほど大きな差別化要因ではありませんが、多くの場合、固有の制約の一部として3つ以上あり、物事が難しい場合があります。

を持っているidことはまた、関係を一流のモデルにします。これは、メタデータが関連付けられている要素を操作する場合に役立ちます。また、後日、メタデータを簡単に追加できることも意味します。これがあなたの「質問4」の意味です。それらの属性を結合モデルに追加します。

通常、結合モデルは他のモデルと同じように作成されます。主キーはでidあり、一連の二次キーを作成します。

create_table :example_things |t|
  t.integer :example_id
  t.integer :thing_id
end

add_index :example_joins, [ :example_id, :thing_id ], :unique => true
add_index :example_joins, :thing_id

メインuniqueインデックスは、重複を防ぎ、キーペアのルックアップを可能にします。セカンダリはexample_id、特定ののすべてを抽出する方法として機能しますthing_id

結合モデルでメタデータを操作する通常の方法は、それらを直接フェッチすることです。

@example_things = @example.example_things.includes(:thing)

これにより、ExampleThingモデルとExampleに関連付けられたThingモデルの両方がロードされます。

于 2012-07-30T15:08:37.103 に答える