通过搜查缩小搜索范围
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
然后我重叠了搜查和这次搜索的表格,所以两者都 运行 具有相同的提交按钮,而且效果很好。
我有工人,工人有很多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
中的搜索 heplerdef self.search_post(search_post)
if search_post
where('date LIKE ?', "%#{search_post}%")
else
all
end
end
然后我重叠了搜查和这次搜索的表格,所以两者都 运行 具有相同的提交按钮,而且效果很好。