我无法理解如何根据用户的出生日期对用户年龄进行范围搜索。我的DB只存储用户dob。我希望访问者使用高级搜索表单并执行年龄搜索,例如'18 -23','28 -36'等。
我尝试过一些东西,但似乎都没有。我将范围添加到用户模型,def min&最大年龄,以及另一个没有成功的解决方案。也许我正在获得一些正确的代码,但没有执行其他部分。我不确定。如果有人可以指导我正确的方向,那么我就可以学到这一点。
当我根据所选年龄进行搜索时,它会返回所有用户。
搜索模型:
attr_accessible :age, :children, :ethnicity, :career, :gender, :religion, :zip_code, :birthday, :max_age, :min_age, :youngest_age, :oldest_age
def users
@users ||= find_users
end
private
def find_users
users = User.order(:id)
users = users.where(gender: gender) if gender.present?
users = users.where(zip_code: zip_code) if zip_code.present?
users = users.where(children: children) if children.present?
users = users.where(religion: religion) if religion.present?
users = users.where(ethnicity: ethnicity) if ethnicity.present?
users = users.where("birthday >= ? AND birthday <= ?", 80.years.ago + 1.day, 18.years.ago)
users
end
end
Search_Form:
<%= select(@object, :youngest_age, (18..75).to_a) %> to <%= select(@object, :oldest_age, (18..75).to_a) %>
答案 0 :(得分:1)
您需要将搜索表单中的两个参数传回控制器。我假设这些将是params[:youngest_age]
和params[:oldest_age]
。我也假设那些将是整数(例如:params[:youngest_age] = 18
)
youngest_age = params[:youngest_age].years
oldest_age = params[:oldest_age].years
User.where("birthday >= ? AND birthday <= ?", Date.today - youngest_age, Date.today - oldest_age)
答案 1 :(得分:1)
这应该这样做:
# view
<%= select @object, :min_age, (18..75).to_a %>
to
<%= select @object, :max_age, (18..75).to_a %>
# controller
def show
@search = Search.find(params[:id])
@users = @search.users
end
# Search model
def find_users
users = User.order(:id)
users = users.where(gender: gender) if gender.present?
users = users.where(zip_code: zip_code) if zip_code.present?
users = users.where(children: children) if children.present?
users = users.where(religion: religion) if religion.present?
users = users.where(ethnicity: ethnicity) if ethnicity.present?
if min_age.present? && max_age.present?
min = [ min_age, max_age ].min
max = [ min_age, max_age ].max
min_date = Date.today - min.years
max_date = Date.today - max.years
users = users.where("birthday BETWEEN ? AND ?", max_date, min_date)
end
users
end
答案 2 :(得分:0)
在此方法中,您的代码中似乎存在错误:
def find_users
users = User.order(:id)
users = users.where(gender: gender) if gender.present?
users = users.where(zip_code: zip_code) if zip_code.present?
users = users.where(children: children) if children.present?
users = users.where(religion: religion) if religion.present?
users = users.where(ethnicity: ethnicity) if ethnicity.present?
users = User.where("birthday >= ? AND birthday <= ?", 80.years.ago + 1.day, 18.years.ago)
users
end
在第二行到最后一行,就在您返回用户之前,您调用“User.where”而不是“users.where”。所以基本上你在那时开始一个新的查询,而不是将所有条件加在一起。
答案 3 :(得分:0)
修复where
方法的最后一个find_users
子句以使用users
关系,以便继续查询链而不是User
模型类,从而有效地重置查询范围。
对于日期范围搜索,您的查询可以完全避免使用常规ruby范围的SQL字符串片段:
用户模型:
def self.with_age_range(year_range)
today = Date.today
where birthday: (today - year_range.max.years)..(today - year_range.min.years)
end
并按如下方式调用:
User.with_age_range 18..23
或在您的控制器中:
@users = User.with_age_range params[:min_age]..params[:max_age]