私が構築している小さなアプリには、交換を作成するコントローラーがあります。ユーザーがエクスチェンジを作成するとき、ユーザーは同時にエクスチェンジの主催者であり、エクスチェンジの参加者でもあります。user_id
参加者は、とを結合する結合テーブルによって追跡されますexchange_id
。主催者はuser_id
、交換テーブルの外部キーによって追跡されます。
取引所の主催者の新しいメンバーシップレコードを自動的に作成するコードをどこに配置するかを考えています。これをexchange_controllerのcreateアクション自体に配置する必要がありますか、それともafter_filter
createアクションによってトリガーされるように配置する必要がありますか?または多分どこか?問題の一部は、適切なafter_filterの使用の良い例が見つからなかったことです(guides.rubyonrails.orgにはそれについての言及がほとんどありませんでした)ので、正しい方向を指すリンクも同様にありがたいです。
関連するモデルコードは次のとおりです。
app/models/user.rb:
# Returns array of exchanges user is participating in
has_many :participations,
:through => :memberships,
:source => :exchange
# Returns array of exchanges user has organized
has_many :organized_exchanges,
:foreign_key => :organizer_id,
:class_name => "Exchange"
app/models/membership.rb:
class Membership < ActiveRecord::Base
attr_accessible :exchange_id, :user_id, :role
belongs_to :exchange
belongs_to :user
end
app/modles/exchange.rb:
belongs_to :organizer,
:foreign_key => :organizer_id,
:class_name => "User"
has_many :memberships, :dependent => :destroy
has_many :participants,
:through => :memberships,
:source => :user
そして、ここに関連するコントローラーコードがあります:
app/controllers/exchanges_controller.rb:
def create
@exchange = Exchange.new(params[:exchange])
@exchange.organizer_id = current_user.id
if @exchange.save
redirect_to exchange_path(@exchange.id)
else
render 'new'
end
end