itora web

9Dec/110

Contare child rows per un determinato record.

Supponiamo il caso di avere un post con relativi articoli, un autore con molti libri, una ditta che ha ricevuto degli ordini, o ancora, un la risposta piu' votata all'interno di un questionario.
In tutti questi casi, per ogni record principale avremo piu' record correlati. Supponiamo il caso di voler contare, nella pagina dove vengono elencate le risposte, quanti voti ogni risposta ha ricevuto, mostrando la piu' votata per prima. In Rails, possiamo scrivere un apposito metodo direttamente nel model.

class Answer < ActiveRecord::Base
	belongs_to :survey
	has_many :vote, :dependent => :destroy	

	def self.more_voted(survey_id)
		voted_answer = find(
			:all, :select => 'answers.*, count(votes.id) as vote_count',
			:conditions => ["answers.survey_id = ?", survey_id],
			:joins => 'left outer join votes on votes.answer_id = answers.id',
			:group => 'answers.id',
			:Order => 'vote_count DESC'
		)
	end
end

Ora nella nostra action 'show' per il controller survey, dove vengono elencate tutte le risposte per il tal survey, possiamo recuperare le answer con il metodo appena creato.

@answers = Answer.more_voted(params[:survey_id])

e mostrare nella view il valore 'vote_count'

<% @answers.each do |a| %>
	<tr class="even">
	<td><%= "#{a.reply}" %></td>
	<td><%= "#{a.vote_count}" %> </td>
	</tr>
<% end %>

Link consigliati:
http://therailsway.com/2007/6/1/railsconf-recap-skinny-controllers
http://blog.devinterface.com/2010/06/rails-best-practices-1-fat-model-skinny-controller/
http://weblog.jamisbuck.org/2006/10/18/skinny-controller-fat-model