最初に...注意の言葉:その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