named_scope
поддерживает группировку. Примерно так должно работать:
class Todo < ActiveRecord::Base
belongs_to :contact
named_scope :one_per_contact, lambda{ |user, campaign|
{
:joins => :contact,
:conditions => ['contacts.user_id = ? AND contacts.campaign_id = ? AND todos.current_date <= ? AND todos.done_date IS NULL', user.id, campaign.id, Date.today],
:group => 'todos.contact_id'
:order => :current_date
}
}
end
Тогда просто поместите это в свой контроллер:
@todos = Todo.one_per_contact(current_user, @campaign)
Код может быть не совсем правильным для вашего приложения, но вы поняли идею.