【问题标题】:Issue with filtering by age when Date of Birth is stored in Database出生日期存储在数据库中时按年龄过滤的问题
【发布时间】:2013-04-06 22:15:27
【问题描述】:

我做了很多研究,但没有发现任何相关的东西。问题是我的用户表有一个 DOB 列。我的用户模型有一个计算用户年龄的年龄方法。我能够按如下方式显示用户年龄:current_user.age,它工作得很好。但我不能在查询中使用年龄,因为它不是用户模型中的属性。其他网站(例如约会网站)如何提供按年龄过滤的选项?我无法想象他们在数据库中有一个年龄列,因为不断更新它会很痛苦。简而言之,如何根据用户提供的年龄范围过滤结果?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.2


    【解决方案1】:

    假设您想查找年龄在 18 到 20 岁之间(包括今天)的用户,并且您将 DOB 存储在名为 dob 的字段中。

    今天正好 18 岁的人将在 1995 年 4 月 6 日出生。而明天将满 21 岁的人将在 1993 年 4 月 7 日出生。

    因此,您希望用户的出生日期介于 1993 年 4 月 5 日和 1995 年 4 月 6 日之间。

    18.years.ago.to_date
    => Thu, 06 Apr 1995
    (20.years.ago + 1.day).to_date
    => Mon, 07 Apr 1993
    

    你现在可以使用了

    User.where("dob >= ? AND dob <= ?", 20.years.ago + 1.day, 18.years.ago)
    

    【讨论】:

    • 好的。但是我如何传递参数?因为用户将有一个文本输入表单来插入从 XX 到 XX 的年龄
    • @pratski,您将数据从客户端表单发送到服务器的格式是什么?
    • 嗯,它是一个蓝图。这是我到目前为止所拥有的:&lt;form&gt; &lt;div class="filtertext"&gt; Ages from: &lt;input type="text" class="gteq"&gt; to &lt;input type="text" class="gteq"&gt; &lt;/div&gt; &lt;div style ="margin-top:10px;"&gt; &lt;%= link_to "Filter",'#', class: "searchprofilebutton" %&gt; &lt;/div&gt; &lt;/form&gt;
    • @pratski,你需要在表单输入中添加一个name 字段(我想你已经知道了)。在您的控制器中,只需在我的答案的最后一行代码中使用params[:min_age].to_iparams[:max_age].to_i 而不是1820
    • 你可能想让你的搜索更精确,并抓住所有当年出生的用户,所以如果年龄在 18 到 20 岁之间,请这样做:User.where("dob &gt;= ? AND dob &lt;= ?", 20.years.ago.to_date.beginning_of_year, 18.years.ago.to_date.end_of_year)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-18
    相关资源
    最近更新 更多