Поиск в пуле базы данных с часами как целое число

У меня есть пул базы данных регистрации, содержащий такие атрибуты, как email, ip, created_at и т. д., И я хочу начать динамический поиск в зависимости от того, сколько часов в Time.now, например. запись регистрации 2 часа назад, без жесткого кодирования этих часов, но мое решение не работает и не работает. Как я могу этого добиться? Ниже приведен беспорядок, который я натворил:

traffic_controller.rb

class TrafficsController < BaseController
  def show
    @search_term = params[:search_term]
    @traffic =
        if params[:search_term] == 'time_calculated'
          SignupHistory.time_calculated
        else
          SignupHistory.all 
        end
  end
end

модель

class SignupHistory < ActiveRecord::Base
  def self.time_calculated
    where('created_at > ?', Time.now - "#{time_difference}".hour)
  end
end

show.html.slim

# search form rows
.row
  .panel.panel-primary
    .panel-heading
      span = t('.search')
    .panel-body
      = form_tag admin_statistic_traffics_path, method: :get
        .col-xs-4 = text_field_tag :search_term, @search_term
        .col-xs-12.col-xs-offset-1 = submit_tag 'Search'
# Table rows
.row
  .panel.panel-primary
    .panel-heading
      span = t('admin_header.traffics')
    .panel-body
      = table_for(@traffic, class: 'table table-condensed table-hover') do |t|
        - t.column :id, 'S/N', class: 'col-xs-1'
        - t.column :email, 'Email', class: 'col-xs-2'
        - t.column :created_at, 'Signed in Date', class: 'col-xs-3' do |x|
          = x.created_at.strftime('%B %e, %Y at %I:%M %p')
        - t.column :login_location, 'Login Location', class: 'col-xs-3'

Я хочу иметь возможность ввести 1 в поле поиска и выполнить поиск, чтобы вытащить записи в таблице, созданной 1 час назад с использованием поля created_at. Но это не работает. Любая помощь будет оценена по достоинству.

Какое у вас поле поиска? time_calculated? Значит, вы хотите поместить 1 в поле вместо строки time_calculated? Или оба - как time_calculated 1?

spickermann 13.09.2018 17:06

Я просто хочу быть динамичным, чтобы разрешить ввод целого числа и поиск на его основе.

Afolabi Olaoluwa Akinwumi 13.09.2018 17:10

@spickermann В базе данных учитывается только created_at. Это единственная запись поля datetime при создании записи

Afolabi Olaoluwa Akinwumi 13.09.2018 17:11
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
29
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Очень простым решением могло бы быть не использование строки time_calculated в качестве триггера для возврата только последних записей SignupHistory, а фактическое наличие числа в этом поле.

# in your controller
def show
  @search_term = params[:search_term]
  @traffic =
      if params[:search_term].to_i > 0
        SignupHistory.time_calculated(params[:search_term])
      else
        SignupHistory.all 
      end
end

# in your model
def self.time_calculated(number)
  where('created_at > ?', number.to_i.hours.ago)
end
это не работает не является неполным описанием ошибки. Что происходит? есть ошибка? Что это за сообщение? Как выглядят параметры и запрос к базе данных в вашем файле журнала?
spickermann 13.09.2018 17:39

Никакой ошибки. но вот журнал Processing by Admin::Statistic::TrafficsController#show as HTML Parameters: {"utf8"=>"✓", "search_term"=>"9", "commit"=>"Search"} > SELECT signup_histories. * FROM signup_histories WHERE (created_at> '2018-09-13 07:40:27') `

Afolabi Olaoluwa Akinwumi 13.09.2018 17:41

Что я должен увидеть, если я ищу 1 для примера, это фильтр записей Time.now - 1.hour, что означает запись, созданную 1 час назад.

Afolabi Olaoluwa Akinwumi 13.09.2018 17:43

Я обновил свой ответ. У меня был days.ago вместо hours.ago

spickermann 13.09.2018 17:45

Я кое-что заметил. После того, как я добавил Time.now - number.to_i.hour к предложенному вами решению, оно работает, но я кое-что заметил. Я создал запись 3 часа назад, поэтому, когда я ищу с 1 по 3, она работает. но когда я искал 4 выше, он показывает всю запись в базе данных

Afolabi Olaoluwa Akinwumi 13.09.2018 18:00

Это интересно, потому что Time.now и Time.current (который используется x.hours.ago) разные. Time.current принимает во внимание часовые пояса, тогда как Time.now не заботится о часовых поясах. Поэтому предпочтительнее Time.current. Я предполагаю, что настройки часового пояса ваших приложений (в приложении, но в вашей базе данных) несовместимы. В каком часовом поясе работает ваш компьютер, какой часовой пояс настроено для использования вашим приложением Rails и какой часовой пояс используется в столбце базы данных created_at?

spickermann 13.09.2018 18:24

Неважно. Решено. У меня болит голова. Когда я ищу 5 часов, запись, которую я создал 3 часа назад, определенно должна быть заполнена

Afolabi Olaoluwa Akinwumi 13.09.2018 19:14

Другие вопросы по теме