3

我无法理解如何根据用户的出生日期对其年龄进行范围搜索。我的数据库仅存储用户 dob。我希望访问者使用高级搜索表单并执行年龄搜索,例如“18-23”、“28-36”等。

我已经尝试了一些东西,但似乎都没有。我将范围添加到用户模型、定义最小和最大年龄,以及另一种没有成功的解决方案。也许我得到了一些正确的代码,但没有执行另一部分。我不知道。如果有人可以指导我正确的方向,那就太好了,这样我就可以学习了。

当我根据所选年龄执行搜索时,它会返回所有用户。

搜索型号:

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

搜索表格:

<%= select(@object, :youngest_age, (18..75).to_a) %> to <%= select(@object, :oldest_age, (18..75).to_a) %>
4

4 回答 4

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)
于 2013-08-14T16:15:10.080 回答
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
于 2013-10-07T12:39:05.200 回答
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”。所以本质上你是在那个时候开始一个新的查询,而不是把所有的条件加在一起。

于 2013-10-10T10:33:17.703 回答
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]
于 2013-10-10T12:06:17.810 回答