ActiveRecords搜索两个参数

时间:2015-02-27 14:07:03

标签: ruby-on-rails activerecord

我有一个名为测量的表和一个名为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'日期存在,因此不会显示任何行。

不知道如何解决这个问题。有线索吗?

1 个答案:

答案 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

如果我没有犯错,代码应该执行以下操作:

  • 在表格中进行最后一次测量。
  • 如果找不到,那么我们设置@sduduled_on并显示页面。
  • 如果提供了日期,我们将其设置为条件+分页值
  • 然后我们实际使用我们的标准进行搜索

我认为问题在于您执行了 redirect_to ,它不存储您定义的变量,基本上每次都会重置您的查询。

让我知道结果如何,我可以根据您的反馈进行修改。

修改 我不是100%肯定这种方法,因为我对你的申请知之甚少。这可能会导致基于数据库中的信息导致页面无效,但遗憾的是我没有足够的信息来捕获所有案例。