У меня есть приложение, где пользователи могут голосовать за записи. Они ограничены общим количеством голосов за 24 часа в зависимости от конфигурации, сохраненной в моей модели настроек. Вот код, который я использую в своей модели голосования, чтобы проверить, не достигли ли они своего предела.
def not_voted_too_much?
@votes_per_period = find_settings.votes_per_period #how many votes are allowed per period
@votes = Vote.find_all_by_user_id(user_id, :order => 'id DESC')
@index = @votes_per_period - 1
if @votes.nil?
true
else
if @votes.size < @votes_per_period
true
else
if @votes[@index].created_at + find_settings.voting_period_in_hours.hours > Time.now.utc
false
else
true
end
end
end
end
Когда это вернется, правда - им разрешат голосовать. Если false
- они не могут. Прямо сейчас он полагается на то, что записи извлекаются в определенном порядке, и тот, который он выбирает, является самым старым. Кажется, это работает, но мне кажется хрупким.
Я хотел бы использовать :order => 'created_at DESC'
, но когда я применяю ограничение к запросу (мне нужно было бы получить только столько записей, сколько голосов разрешено за этот период), кажется, что всегда извлекаются самые старые записи вместо последних записей, и я не уверен, как изменить запрос, чтобы получить последние голоса, а не самые старые.
Есть какие-нибудь мысли о том, как это сделать?