Мне нужен совет по системе голосования в рельсах, который ежемесячно распознает верхний избиратель. У меня есть система, которая работает, но новичок в рельсах, я уверен, что есть более эффективные методы. Ниже представлена упрощенная версия моей текущей установки (контроллер кода опущены):Ruby on Rails - ежемесячный топ-геттер
class Charity < ActiveRecord::Base
has_many :votes
end
class Vote < ActiveRecord::Base
belongs_to :charity
end
Моя схема выглядит следующим образом:
ActiveRecord::Schema.define(:version => 20130310015627) do
create_table "charities", :force => true do |t|
t.string "name"
t.text "description"
t.date "last_win"
t.datetime "created_at", :null => false
t.datetime "updated_at", :null => false
end
create_table "votes", :force => true do |t|
t.integer "charity_id"
t.datetime "created_at", :null => false
t.datetime "updated_at", :null => false
end
end
Я буду использовать «когда» драгоценный камень, чтобы запустить хрон определить ежемесячный победитель и обновить столбец «last_win» таблицы благотворительных услуг. Следующий код, где я сомнение своей эффективности:
vote_counts = Vote.count(:group => "charity_id")
most_votes = vote_counts.values.max
winning_ids = vote_counts.map{|k,v| v == most_votes ? k :nil }.compact
charities = Charity.find(winning_ids)
charities.each {|charity| charity.update_attributes(:last_win => Date.today)}
Я уверен, что есть много способов сделать это лучше, и хотели бы некоторые предложения. Если у вас есть предложения по лучшим способам создания таблицы голосов/ассоциаций, это тоже будет оценено.
Спасибо заранее, CRS
Может ли быть только один победитель? Похоже, ваш код обрабатывает связи. –
Может быть несколько победителей. Задача cron будет работать в первый день месяца. Я настрою его только на подсчет голосов за предыдущий месяц. – Clay