【发布时间】:2018-06-29 11:55:22
【问题描述】:
我正在为我的开支做一个 Rails 应用程序
基本上我有一个 User 表和一个 Spending 表,它们之间都有关系(用户 has_many 支出,支出属于_to users)
我在一个带有标题、日期和 user_id 的索引中遍历了所有用户的所有支出。我在此索引上添加了一个搜索按钮,以根据特定范围日期查找支出,我希望也能够根据 user_id 进行排序。
我的 index.html.erb 中有这个:
<p>
<%= form_tag spendings_path, method: :get do %>
<%= date_field_tag "search[date_from]", @search.date_from, class: 'form-control col-2 d-inline-block' %>
<%= date_field_tag "search[date_to]", @search.date_to, class: 'form-control col-2 d-inline-block' %>
<%= select_tag :user_id, options_from_collection_for_select(User.all, :id, :firstname, params[:user_id]), include_blank: true, class: 'form-control col-2 d-inline-block' %>
<%= submit_tag "Search", class: "btn btn-secondary col-1 d-inline-block'" %>
<% end %>
这正确地向我显示了我想要的内容,并且当我使用选定的用户进行搜索时,URL 变为:
http://localhost:3000/spendings?utf8=%E2%9C%93&search%5Bdate_from%5D=2017-12-20&search%5Bdate_to%5D=2018-01-20&user_id=&commit=Search
我在其中创建了一个名为 consumption_search 的模型:
class SpendingSearch
attr_reader :date_from, :date_to, :user_id
def initialize(params)
params ||= {}
@date_from = parsed_date(params[:date_from], 1.month.ago.to_date.to_s)
@date_to = parsed_date(params[:date_to], Date.today.to_s)
@user_id = params[:user_id]
end
def scope
Spending.where("date BETWEEN ? AND ? AND user_id = ?", @date_from, @date_to, user_id)
end
private
def parsed_date(date_string, default)
Date.parse(date_string)
rescue ArgumentError, TypeError
default
end
end
这是我的支出控制器:
def index
@search = SpendingSearch.new(params[:search])
@spendings = @search.scope
end
这是我在索引中的循环:
<% @spendings.reverse_each do |spending| %>
明显不同的数据。
问题是我无法得到任何结果。出于某种原因,我不知道它不会向我显示带有 user_id 的结果。我在这里遗漏了一些东西,但是什么?
如果我尝试在支出搜索模型中修改范围:
def scope
Spending.where("date BETWEEN ? AND ?", @date_from, @date_to)
end
然后我按日期得到了一些结果,但当然没有用户“过滤器”。
谁能帮我解决这个问题?
非常感谢
【问题讨论】:
-
我尝试更改支出搜索模型。如果我输入@user_id = 1,则初始化(参数)。我根据日期获得第一个用户的所有结果。看起来我无法通过表单让 user_id 通过参数。我在 URL 中有它,但在搜索中没有。那么它来自我的索引吗?也许我没有正确调用 user_id。在我搜索时的控制台中,它写着 user_id = NULL
标签: ruby-on-rails date search filter ruby-on-rails-5