根据出生日期搜索用户年龄

时间:2013-08-14 15:56:55

标签: ruby-on-rails search date-of-birth

我无法理解如何根据用户的出生日期对用户年龄进行范围搜索。我的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) %>

4 个答案:

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