我有一个名为测量的表和一个名为measure的模型。 我在控制器中有一个方法one_day_measurements_index。 这是代码:
def one_day_measurements_index
@record = Measurement.last
if @record.blank?
@scheduled_on = Date.today
else
@scheduled_on = params[:date] || @record.scheduled_on
end
if @record.blank?
flash[:danger] = "No Measurements Calculated."
redirect_to measurements_path
else
if @scheduled_on.blank?
@scheduled_on = params[:date] || Date.today
end
@page = params[:page] || 1
@per_page = params[:per_page] || WillPaginate.per_page
if params[:search]
@measurements = Measurement
.where("scheduled_on = '#{@scheduled_on}'")
.search(params[:search])
.paginate(:per_page => @per_page, :page => params[:page])
.order("get_inst_status(instrument_id), instrument_id")
else
@measurements = Measurement
.where("scheduled_on = '#{@scheduled_on}'")
.paginate(:per_page => @per_page, :page => params[:page])
.order("get_inst_status(instrument_id), instrument_id")
end
end
measurements_hash @measurements
end
我可以使用搜索输入字符串,模型中的搜索方法是:
private
def self.search(search)
where('
upper(reading_type) like upper(:search)
or upper(daily_sequence) like upper(:search)
or upper(reading_frequency) like upper(:search)
or upper(reading_period) like upper(:search)
or upper(reading_period) like upper(:search)
or upper(measured_by) like upper(:search)
or upper(measured_with) like upper(:search)
or upper(crew) like upper(:search)
or get_inst_id(instrument_id) like upper(:search)
or get_inst_group_id(instrument_id) like upper(:search)
or upper(get_inst_status(instrument_id)) like upper(:search)
', search: "%#{search}%")
end
在one_day_measurements_index.html.erb中,我正在使用此搜索标记:
<%= form_tag one_day_measurements_index_path, :method => 'get', class: "search" do %>
<%= text_field_tag(:search, params[:search], options = {:placeholder => "Search", :class => "search_field"})%>
<% end %>
routes.rb中的路径是:
match 'one_day_measurements_index', to: 'measurements#one_day_measurements_index', via: 'get'
这是问题所在。 呈现的页面显示在行的顶部,搜索标记允许用字符串表示。 在列出的行下面,我有一个标签可以选择日期选择器,因为我只想查看该日期的记录。 这是:
<%= form_tag one_day_measurements_index_path, :method => 'get' do %>
<%= text_field_tag :date, params[:date], options = {:placeholder => "Date (yyyy-mm-dd)", :class => 'datetimepicker'} %>
<%= submit_tag "Show Measurements for Date", class: "btn btn-xs btn-primary"%>
<% end %>
所以简而言之,我必须搜索一个字符串的标签,让我们说一个工具类型和我希望看到这些记录的日期。实际上,我希望在“2015-02-25”日期看到MPBX类型乐器的所有记录。整个表格之后还有两个日期的记录,'2015-02-26'和'2015-02-27'。
当我输入'2015-02-25'日期时,我只能看到该日期的记录,这是正确的。但是当我在其他搜索标签中输入字符串MPBX后,显示的呈现页面是'2015-02-27'的日期,即表中记录的最后日期。此外,由于MPBX仅在'2015-02-25'日期存在,因此不会显示任何行。
不知道如何解决这个问题。有线索吗?
答案 0 :(得分:0)
好,
根据您的评论,我首先将您的控制器代码重构为更具可读性的结构。我希望通过这样做我没有打破你的逻辑:
def one_day_measurements_index
unless Measurements.last
@scheduled_on = Date.Today
flash[:danger] = “No Measurements Calculated.”
render(action: "one_day_measurements_index") and return
end
@scheduled_on = params[:date] || @record.scheduled_on
@page = params[:page] || 1
@per_page = params[:per_page] || WillPaginate.per_page
# Now we actually search on date first.
@measurements = Measurement.where("scheduled_on = '#{@scheduled_on}'")
# if the search string is provided, we perform a narrower search on
# the records of the matching date.
if params[:search]
@measurements.where('
upper(reading_type) like upper(:search)
or upper(daily_sequence) like upper(:search)
or upper(reading_frequency) like upper(:search)
or upper(reading_period) like upper(:search)
or upper(reading_period) like upper(:search)
or upper(measured_by) like upper(:search)
or upper(measured_with) like upper(:search)
or upper(crew) like upper(:search)
or get_inst_id(instrument_id) like upper(:search)
or get_inst_group_id(instrument_id) like upper(:search)
or upper(get_inst_status(instrument_id)) like upper(:search)
', search: “%#{params[:search]}%”)
end
# We finish by paginating and ordering our result.
@measurements.paginate(:per_page => @per_page, :page => params[:page])
@measurements.order("get_inst_status(instrument_id), instrument_id")
end
如果我没有犯错,代码应该执行以下操作:
我认为问题在于您执行了 redirect_to ,它不存储您定义的变量,基本上每次都会重置您的查询。
让我知道结果如何,我可以根据您的反馈进行修改。
修改强> 我不是100%肯定这种方法,因为我对你的申请知之甚少。这可能会导致基于数据库中的信息导致页面无效,但遗憾的是我没有足够的信息来捕获所有案例。