Как отфильтровать пользователей по точному году с датой в виде столбца в базе данных? - PullRequest
0 голосов
/ 09 мая 2018

Я хочу отфильтровать пользователей с помощью команды SQL в моей модели, если пользователю, например, ровно 5 лет. Как я могу сделать это? Запрос диапазона работает, но удаление диапазона ничего не возвращает.

Это работает, но я хочу, чтобы он выводился точно в возрасте 21 года (если дата рождения 1997/01/01), и он не должен включать 22 года.

users = users.where(["birthdate >= ? AND birthdate <= ?", 22.years.ago + 1.day, 21.years.ago])

Я пробовал этот, но он ничего не выводит: users = users.where(["birthdate = ?", 21.years.ago])

схема для пользователей

create_table "users", force: :cascade do |t|
t.string "email", default: "", null: false
t.string "encrypted_password", default: "", null: false
t.string "reset_password_token"
t.datetime "reset_password_sent_at"
t.datetime "remember_created_at"
t.integer "sign_in_count", default: 0, null: false
t.datetime "current_sign_in_at"
t.datetime "last_sign_in_at"
t.inet "current_sign_in_ip"
t.inet "last_sign_in_ip"
t.string "position"
t.string "employee_id"
t.string "first_name"
t.string "middle_name"
t.string "last_name"
t.string "gender"
t.string "address"
t.string "sss_number"
t.string "tin_number"
t.string "phil_health"
t.string "emergency_name"
t.string "emergency_contact"
t.date "birthdate"
t.date "date_hired"
t.string "role", default: "user"
t.integer "department_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["email"], name: "index_users_on_email", unique: true
t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true

конец

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Я снова прочитал ваш пост, и я думаю, вы ищете пользователей, чей день рождения является данной датой.Они родились сегодня n лет назад.Если это так, одним из способов может быть установка какого-либо фильтра в вашей пользовательской модели, например:

def self.filter_year(year)
  where("cast(strftime('%Y', birthdate) as int) = ?", year)
end

def self.filter_month(month)
  where("cast(strftime('%m', birthdate) as int) = ?", month)
end

def self.filter_day(day)
  where("cast(strftime('%d', birthdate) as int) = ?", day)
end

. Затем вызовите фильтр по своему желанию, чтобы получить коллекцию пользователей:

users = User.filter_year(1997).filter_month(5).filter_day(9)

Youполучить всех пользователей, которым сегодня исполняется 21 год.

Может быть, есть лучший способ, может быть, это не то, что вы ищете.

Но я надеюсь, что это может помочь.

Спасибо за этот ответ .

0 голосов
/ 09 мая 2018

Вы можете использовать Range и методы beginning_of_year и end_of_year, например:

date = 22.years.ago #example
User.where(birthdate: date.beginning_of_year..date.end_of_year)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...