How do I change the records being displayed on the

2019-08-12 08:42发布

问题:

I have a rails app that shows statistics based on an employee's daily production. currently my page shows ALL records.

I know how to show various different combinations such as records made between two dates etc... but what I really would like to do is make it so that single page (say the index page) has 3 controls that allow for it to switch between daily statistic records, weekly statistic records and a custom date constraint of statistic records (such as from date xx/xx/2009 to date xx/xx/2010). I have been searching for a while to attempt to figure this out but I am obviously missing something as I cannot find anyone else who has run into the same issues.

If this is too difficult to do this way, the other - mostly easy way I can see to do this is to create a page for each view, however it still leaves a question on how I set up the control to choose the custom date constraints.

I aplogise in advance for my newbyness but if someone could explain this to me, I think it is going to really increase my understanding of rails. Thanks in advance

回答1:

Your control can easily append some information to the query string. Like this form does:

<form action="" method="get">
  <fieldset>
     <button type="submit" name="show" value="daily">Daily stats</button>
     <button type="submit" name="show" value="weekly">Weekly stats</button>
  </fieldset>
  <fieldset>
     From <input type="text" name="interval-start" value="" /> till
     <input type="text" name="interval-end" value="" />
     <button type="submit" name="show" value="interval">Stats for the specified interval</button>
  </fieldset>
</form>

When user clicks on some button, browser sends all form fields to the server-side. On the server-side, in your action, you can check for the show property of the params array. Like this:

@reports = case params["show"]
    when "daily"
        #Just an example. Use ActiveRecord's query interface or Arel in Rails 3, not plain queries
        Report.find_by_sql "SELECT * FROM reports WHERE DATE(report_date) = DATE(NOW())"
    when "weekly"
        Report.find_by_sql "SELECT * FROM reports WHERE WEEK(report_date) = WEEK(NOW())"
    when "interval"
        Report.find_by_sql "..."
    else
        #Some other possible values, filters, so on
end

And in your view just output the @report variable as usual.


You could also create a new route for that filtering, maybe /reports/:name, and avoid using forms. In this case, you only create some links that point to the right filter (/reports/daily, /reports/weekly, etc). On the server-side you need to check reports[:name] for the appropriate value.