ruby-on-rails – Ransack:使用年龄而不是出生日期

我想使用ransack为用户构建一个高级搜索功能.
我有一个方法来计算从出生日期开始的年龄:

def age(dob)
  Now = Time.Now.utc.to_date
  Now.year - dob.year - ((Now.month > dob.month || (Now.month == dob.month && Now.day >= dob.day)) ? 0 : 1)
end

这适用于正常显示(如年龄(@ user.date_of_birth))

但是当使用search_form_for时,我不能这样做:

<%= search_form_for @search,url: search_users_path,method: :post do |f| %>
    <div class="field">
        <%= f.label :date_of_birth_gteq,"Age between" %>
        <%= f.text_field :date_of_birth_gteq %>
        <%= f.label :date_of_birth_gteq,"and" %>
        <%= f.text_field :date_of_birth_lteq %>
    </div>
<div class="actions"><%= f.submit "Search" %></div>
 <% end %>

我的问题是:如何在搜索中使用年龄而不是出生日期?

解决方法

添加如下所示的范围以查找给定年龄的日期.

scope :age_between,lambda{|from_age,to_age|
  if from_age.present? and to_age.present?
    where( :date_of_birth =>  (Date.today - to_age.to_i.year)..(Date.today - from_age.to_i.year) )
  end
}

对于ransacke语法:

ransacker :age,:formatter => proc {|v| Date.today - v.to_i.year} do |parent|
  parent.table[:date_of_birth]
end

在视野中

<%= f.text_field :age_gteq %>

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...