通过搜查缩小搜索范围

Narrowing search with ransack

我有工人,工人有很多post。我希望能够搜索一个工人,显示他所有的 post,然后缩小到制造 post 的日期。我可以按工作人员的姓名搜索,但是当我尝试搜索日期时,它也只显示该工作人员的所有 post(如果日期存在于一个 post 中)。

我正在尝试 运行 与:

控制器:

@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>

除非您创建了一个自定义的开始谓词,否则这将不起作用。 从你的 group_by 声明中我可以看到你的帖子有一个日期字段。如果你只想在指定的日期发帖,你可以使用 eq predicate

<%= f.search_field :posts_date_eq %>

如果您需要处理用户输入,我会考虑制作自定义谓词,您可以在此处查看如何操作 -> creating custom predicates

编辑

测试将日期字段字符串解析为日期输入

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

在您的搜索对象之前

@q = Worker.ransack(params[:q])

我是这样解决的

而不是

<% 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

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

然后我重叠了搜查和这次搜索的表格,所以两者都 运行 具有相同的提交按钮,而且效果很好。