auto_assign というコントローラー更新メソッドで呼び出す必要があるクラス メソッドがあります。
基本的に、リクエストの量が最も少ないアーティストを見つけて、そのアーティスト ID をオブジェクトに割り当てます。
create メソッドでは完全に機能しますが、update メソッドでは呼び出されません。その理由はわかりません。
コントローラ
def update
@virtual_request = VirtualRequest.find(params[:id])
@virtual_request.auto_assign! # this never gets called
if @virtual_request.update_attributes(virtual_params)
flash[:success] = "Virtual request updated"
redirect_to virtual_request_path(@virtual_request)
else
render 'edit'
end
end
def create
@virtual_request = VirtualRequest.new(virtual_params)
@virtual_request.auto_assign! # works fine here!
if @virtual_request.save
flash[:success] = "Virtual has been created and assigned to # {@virtual_request.artist.name}"
redirect_to virtual_requests_path
else
render 'new'
end
end
クラス VirtualRequest
def auto_assign!
if self.artist_id == 0
artists = Artist.in_queue?.collect {|p| [ p.id, p.virtual_requests.count ] }
self.artist_id = artists.sort { |a,b| a[1] <=> b[1] }.first[0]
end
end
HTML送信パラメータ
<select id="virtual_request_artist_id" name="virtual_request[artist_id]">
<option selected="selected" value="0">auto-assign</option>
<option value="2">Artist 1</option>
<option value="5">Artist 2</option>
</select>
params の値が 0 の場合、自動割り当てされるはずです
更新: 解決済み
コントローラ
def update
@virtual_request = VirtualRequest.find(params[:id])
if @virtual_request.update_attributes(virtual_params)
@virtual_request.auto_assign!
flash[:success] = "Virtual request updated"
redirect_to virtual_request_path(@virtual_request)
else
render 'edit'
end
end
クラス
def auto_assign!
if self.artist_id == 0
artists = Artist.in_queue?.collect {|p| [ p.id, p.virtual_requests.count ] }
self.artist_id = artists.sort { |a,b| a[1] <=> b[1] }.first[0]
self.save
end
end