2013-04-25 3 views
0
class Rate < ActiveRecord::Base 
attr_accessible :image_id, :rate, :user_id 
belongs_to :image 
belongs_to :user 
validate :user_can_rate_after_one_day 

before_save :default_values 

def default_values 
self.rate ||=0 
end 

protected 
    def user_can_rate_after_one_day 
    r=Rate.where(:image_id =>image_id, :user_id=> user_id).order("created_at DESC").limit(1) 

    if((Time.now - 1.day) < r[0].created_at) 
     self.errors.add(:rate,"you can only vote once per day") 
    else 
     return 
    end 
    end 
end 

У меня есть одна модель ставок, и я хочу, чтобы пользователь мог оценивать только один раз в день. Я пишу метод user_can_rate_after_one_day для его проверки. Если я удалю функцию, пользователь может оценить много раз, если я добавлю эту функцию, пользователь не сможет оценить ее. Кто-нибудь знает, что здесь не так? Спасибоrails3 пользователь может голосовать только один раз в день

+0

Я не уверен, в чем вопрос. Вы говорите, что ваш метод проверки не работает должным образом? Что он не позволит пользователю оценивать вообще, даже если они уже не оценили что-то уже сегодня? – MrDanA

+0

Уверены, что у вас нет ошибок на консоли; –

+0

ну, позвольте мне объяснить. метод user_can_rate_after_one_day должен работать следующим образом: когда нет скорости, он должен проверять true. если есть ставка, и ставка не старше одного дня, она должна быть недействительной. Я записываю условие if как «if (r [0]! = nil && (Time.now <(r [0] .created_at + 1.day)))", когда нет записи, я думаю, что условие должно быть ложным, затем пройти проверку, но в результате это условие всегда истинно и валидация всегда терпит неудачу. – user1611237

ответ

0

У меня также такой же тип проблемы. Я попытался создать приложение, в котором конкретный пользователь может добавить standup только для текущего дня. Я написал код в моем контроллере, создав действие. Логика почти похожа на ваш вопрос, но я нашел одну проблему в вашем коде, из-за которой ваша дата не сравнивается должным образом. Time.now - 1.day возвращение в этом формате 2018-01-22 11:24:23 +0545 и standup[0].created_at возвращение в этом формате Mon, 22 Jan 2018 08:58:57 UTC +00:00. Итак, чтобы решить эту проблему, я конвертировал и дату в том же формате, i.e (Time.now - 1.day).strftime('%F %H:%M:%S') < standup[0].created_at.strftime('%F %H:%M:%S'), который возвращает true, а код работает.

Возможно, это будет полезно и для других зрителей.

Смежные вопросы