Сужение поиска с обыском

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

с чем я пытаюсь работать:

контроллер:

@q = Worker.ransack(params[:q])
@workers = @q.result.order(name: :asc).includes(:posts).uniq

Посмотреть:

<%= search_form_for @q do |f| %>

<%= f.label :name_cont %>
<%= f.search_field :name_cont %>

<%= f.label :posts_date_start %>
<%= f.search_field :posts_date_start %>

<%= f.submit %>
<% end %>

<% @workers.each do |worker| %>
<% worker.posts.group_by { |t| t.date.to_time.beginning_of_month }.each do |month, posts| %>
<some table header logic>
<% posts.each do |post| %>
<table content>

person crazettett    schedule 31.07.2015    source источник


Ответы (2)


Если вы не создали собственный предикат запуска, это не сработает. Из вашего оператора group_by я вижу, что в ваших сообщениях есть поле даты. Если вам нужны сообщения только для указанной даты, вы должны использовать предикат eq

<%= f.search_field :posts_date_eq %>

Если вам нужно массировать ваш пользовательский ввод, я бы рассмотрел создание собственного предиката, вы можете посмотреть, как это сделать здесь -> создание пользовательских предикатов

РЕДАКТИРОВАТЬ

Чтобы проверить синтаксический анализ строки поля даты в дату, введите

begin 
  params[:q][:posts_date_eq] = Date.parse(params[:q][:posts_date_eq])
rescue 
  # no param present 
end

перед объектом поиска

@q = Worker.ransack(params[:q])
person aaron.v    schedule 31.07.2015
comment
установка его на eq делает то же самое. проблема в том, что когда поле даты совпадает с любой датой в любом сообщении, связанном с этим работником, оно просто показывает все сообщения для работника, а не только указанные. - person crazettett; 31.07.2015
comment
в контроллере попробуйте проанализировать дату, которую вы указали в текстовом поле. Rails знает только, что это строка, поэтому он не будет искать по дате, когда вы дадите ему строку. Если вы измените параметр на объект даты, я уверен, что это сработает. params[:q][:posts_date_eq] = Date.parse(params[:q][:posts_date_eq]), было бы лучше создать собственный предикат, который делает это за вас, поскольку вам не нужно будет проверять, есть ли параметр для его анализа. - person aaron.v; 31.07.2015
comment
Поместите эту строку прямо перед @q = Worker.ransack(params[:q]), вы можете поместить ее в блок начала восстановления, чтобы убедиться, что она не сломается на nil для тестирования. - person aaron.v; 31.07.2015
comment
это дает мне неопределенный метод `[]' для nil:NilClass. Я тоже не понимаю, как это может помочь - person crazettett; 31.07.2015
comment
Вам нужно либо убедиться, что параметр присутствует, либо обернуть его в begin params[:q][:posts_date_eq] = Date.parse(params[:q][:posts_date_eq]) rescue # no param present end, чтобы он не сломался. Ransack не может выполнять поиск в поле, если оно не является правильным типом. Вы передаете строку для поиска в поле даты, ransack хочет, чтобы объект даты отфильтровывался в поле даты. - person aaron.v; 31.07.2015
comment
Пожалуйста, посмотрите на мой исправленный ответ - person aaron.v; 31.07.2015
comment
на этот раз ошибки нет, но я не замечаю никакой разницы, тот же результат - person crazettett; 31.07.2015
comment
Я вижу это сейчас, он правильно фильтрует этот добавленный код, но он дает вам всех рабочих, у которых есть сообщения на этот день. Вам все равно нужно будет просматривать сообщения отдельно, чтобы получать сообщения, вы можете использовать дату, которую вы проанализировали, и отправить ее в свое представление в качестве переменной, чтобы ограничить ваши сообщения worker.posts.where(date: @date) в вашей таблице. - person aaron.v; 31.07.2015
comment
Вероятно, было бы безопаснее просто отправить сообщения, уже включенные в ваш обзор. - person aaron.v; 31.07.2015
comment
Я мог видеть, как это работает. но как именно использовать @date? очевидно, я мог бы просто добавить стандартную дату, которую он запрашивает из @date = 2015-0101, но я хочу, чтобы она исходила из поиска кражи - person crazettett; 31.07.2015
comment
Я вижу, как насчет того, чтобы вы выполняли поиск по сообщениям вместо рабочих, вы бы изменили :name_cont на :worker_name_cont, а затем просто сделали date_eq для даты, изменили свой синтаксический анализ на этот ключ, а затем просто зациклили свои результаты сообщений, сгруппированные по вашим рабочим, если это как вы хотите это отображать - person aaron.v; 31.07.2015
comment
это работает, как и ожидалось, я уже настроил это в модели Post. но проблема показывается на каждого работника, как я пытаюсь здесь. - person crazettett; 31.07.2015
comment
@posts.group_by{ |p| p.worker}.each do |worker, posts| должно помочь. Создайте свои таблицы на основе рабочего в этом цикле, и он должен работать - person aaron.v; 31.07.2015
comment
Я случайно сделал другое решение, я совместил поиск разорителя с простым поиском из railscast. но спасибо за вашу помощь. Я уверена, что ты расшевелил некоторые клетки мозга, потерянные для меня. - person crazettett; 31.07.2015
comment
Рад, что вы нашли то, что вам нужно :) - person aaron.v; 31.07.2015

Я решил это так

вместо

<% worker.posts.group_by { |t| t.date.to_time.beginning_of_month }.each do |month, posts| %>

я сделал

<% Post.search_post(params[:search_post]).search_post_present(params[:search_post_present]).where(worker_id: worker.id).order(date: :asc).group_by { |t| t.date.to_time.beginning_of_month }.each do |month, posts| %>

что указывало на поисковый хеплер в post.rb

def self.search_post(search_post)
  if search_post
    where('date LIKE ?', "%#{search_post}%")
  else
    all
  end
end

Затем я совместил формы и для ransack, и для этого поиска, так что обе они запускаются с одной и той же кнопкой отправки, и это сработало просто отлично.

person crazettett    schedule 02.08.2015