У меня есть пул базы данных регистрации, содержащий такие атрибуты, как 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
. Но это не работает. Любая помощь будет оценена по достоинству.
Я просто хочу быть динамичным, чтобы разрешить ввод целого числа и поиск на его основе.
@spickermann В базе данных учитывается только created_at
. Это единственная запись поля datetime при создании записи
Очень простым решением могло бы быть не использование строки 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
Никакой ошибки. но вот журнал 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') `
Что я должен увидеть, если я ищу 1 для примера, это фильтр записей Time.now - 1.hour
, что означает запись, созданную 1 час назад.
Я обновил свой ответ. У меня был days.ago
вместо hours.ago
Я кое-что заметил. После того, как я добавил Time.now - number.to_i.hour
к предложенному вами решению, оно работает, но я кое-что заметил. Я создал запись 3 часа назад, поэтому, когда я ищу с 1 по 3, она работает. но когда я искал 4 выше, он показывает всю запись в базе данных
Это интересно, потому что Time.now
и Time.current
(который используется x.hours.ago
) разные. Time.current
принимает во внимание часовые пояса, тогда как Time.now
не заботится о часовых поясах. Поэтому предпочтительнее Time.current
. Я предполагаю, что настройки часового пояса ваших приложений (в приложении, но в вашей базе данных) несовместимы. В каком часовом поясе работает ваш компьютер, какой часовой пояс настроено для использования вашим приложением Rails и какой часовой пояс используется в столбце базы данных created_at?
Неважно. Решено. У меня болит голова. Когда я ищу 5 часов, запись, которую я создал 3 часа назад, определенно должна быть заполнена
Какое у вас поле поиска?
time_calculated
? Значит, вы хотите поместить1
в поле вместо строкиtime_calculated
? Или оба - какtime_calculated 1
?