2013-09-14 5 views
0

В моем приложении rails пользователь может искать пациентов и выбирать, сколько лет пациенту следует максимально!Date.today минус 18 лет Ruby

Здесь вы можете увидеть мой код, в котором выбраны только пациенты, у которых больной, родившийся мало или равен максимальному возрасту.

patients = patients.where("birthday >= ?", year(maximal)) if maximal.present? 

Типы пользователей в возрасте для, например, 15, как максимальные, так что я должен преобразовать входной сигнал к дате:

def year(maximal) 
    a = Date.today 
    year = a.year - maximal 
    month = a.mon 
    day = a.mday 
    Date.new(year,month,day) 
end 

Теперь моя проблемы: Если у меня есть для, например:

Patient.birthday => 29.09.1994 (означает HES 18)

и ¯u ser для максимального => 18

Этот пользователь не отображается в списке, хотя должен быть показан. Я знаю, что мне нужно изменить свой год обучения, но я не знаю, как это сделать! Может быть, вы можете мне помочь Спасибо!

UPDATEUPDATEUPDATEUPDATEUPDATEUPDATEUPDATEUPDATEUPDATEUPDATEUPDATEUPDATE

Ok мой новый код:

patients = patients.where("#{age(:birthday)} >= ?", maximum) if maximum.present? 

и

def age(dobss) 
dob = Date.new(dobss) 
now = Time.now.utc.to_date 
now.year - dob.year - ((now.month > dob.month || (now.month == dob.month && now.day >= dob.day)) ? 0 : 1) 
end 

Но теперь я получаю ошибку:

comparison of Symbol with 0 failed 
app/models/search.rb:28:in `<' 
app/models/search.rb:28:in `new' 
app/models/search.rb:28:in `age' 
+3

возможный дубликат [Получить возраст человека в Рубине] (HTTP: // stackover flow.com/questions/819263/get-persons-age-in-ruby) –

+0

Как выглядит строка 28 в 'app/models/search.rb'? – lurker

+0

28 is dob = Date.new (dobss) На самом деле: день рождения определяется как дата в моей модели –

ответ

1

Попробуйте тот же код с:

def year(maximal) 
    a = Date.tomorrow 
    year = (a.year - maximal) - 1 
    month = a.mon 
    day = a.mday 
    Date.new(year,month,day) 
end 

Обратите внимание, основное изменение заключается в отсылке к tomorrow вместо today, и понизить год еще один год. Делая это, вы отбросили день рождения до самого последнего дня 18-го года.

Метод year теперь дает вам всех людей того возраста. Вам просто нужно переопределить имя метода примерно как min_birthdate_for_age(age). Но теперь, если вы хотите использовать этот метод для поиска людей, которые, по крайней мере, этого возраста, затем измените поиск соответственно: вместо поиска людей, родившихся в тот день или после, т.е. >=, измените его на более ранние даты, т.е. <.

@ MattJohnson отлично дал ссылку на similar question, что было бы неплохо принять к сведению, поэтому используйте в сочетании с моим ответом. В основном он говорит, что високосные годы вызовут такой код. Короткий обходной путь, чтобы избежать аварий високосного года будет переписать метод так:

def min_birthdate_for_age(age) 
    a = Date.tomorrow 
    a.ago((age + 1).years) 
end 
+0

Очень хорошо, но вы имеете в виду, что когда у кого-то есть день рождения 31 из dezmber, он не будет работать? –

+0

Theres еще одна проблема, я хотел бы использовать ту же функцию, а также за минимальный год? Я не думаю, что возможно –

+0

Пожалуйста, просмотрите мое обновление –

1

Если в день рождения пациента:

29.09.1994 

И вы берете сегодняшнюю дату, которая является:

14.09.2013 

А вы отнимите 18, вы получите:

13.09.1995 

Так день рождения пациента не будет быть в списке. При работе с днями рождения и определении различий по году вам также необходимо учитывать, какой месяц и день, или вы можете быть в расчете.

Если вы не хотите этого делать, вам нужно будет произвести расчет самостоятельно со дня рождения. Если вы знаете месяц, день и год своего дня рождения, укажите year(maximal), проверьте, день рождения или день рождения до текущей даты. Если они есть, то вычтите еще один год.

+0

Да, я знаю, но как? –

+0

@ user2724695 Я добавил некоторое объяснение, что можно сделать. – lurker

+0

Пожалуйста, просмотрите мое обновление –

1

Похоже, что вы пытаетесь получить дату определенного количества лет назад, в этом случае вы должны использовать методы years и ago, что Rails предоставляет:

18.years.ago 

который, в контексте даст вам:

patients = patients.where("birthday >= ?", maximal.years.ago) if maximal.present? 
+0

Пожалуйста, просмотрите мое обновление! Ваш код не будет работать –

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