使用洗劫的宝石过滤未定义的方法错误的年龄(Undefined method error for fi

2019-10-17 23:45发布

我试图使用过滤器由洗劫年龄结果,但遍寻是给我一个未定义的方法错误。 我有用户在我的数据库DOB和我的用户模型我有一个计算用户的年龄的年龄的方法。 它运行完美,我能够调用用户的年龄是这样的:

@user = User.find(1)
@user.age

现在洗劫我已经在我的控制下:

  def index
   @search = User.search(params[:q])
   @users = @search.result
  end

在我看来,我有:

<%= search_form_for @search do |f| %>
    <%= f.label :age_gteq, "Ages:" %> <%= f.text_field :age_gteq %>
    <%= f.label :age_lteq, "to" %> <%= f.text_field :age_lteq %>
    <%=f.submit "Filter", class: "button" %>
<% end %>

这是我得到的错误:

undefined method `age_gteq' for Ransack::Search<class: User, base: Grouping <combinator: and>>:Ransack::Search

我相信我会得到同样的错误age_lteq

Answer 1:

据我所知,这是行不通的,因为目前仅搜查与数据库列的作品。 到底洗劫仅仅是一个复杂的SQL查询生成。

想想这个例子:

User.where('age >= ?', 30)

将一个SQL查询是什么样的?

SELECT * FROM user WHERE age >= 30

即使洗劫将通过正常的非数据库的属性这样的条件下管时,SQL仍然是错误的。 (由于没有age列)

一个解决办法是在你的形式使用原来的日期的出生列,并使用JavaScript来允许用户输入的日期,而不是年龄数。 例如,通过听onsubmit事件和修改input的内容。

更新少儿模特:

还有另一种可能性,使这项工作。 添加到您的User模式:

ransacker :age do
  Arel::Nodes::SqlLiteral.new(
     'DATE_PART('year', AGE(NOW(), date_of_birth_column))') 
  # Beware: PostgreSQL specific SQL!
end

A“ransacker”需要返回后来将被附加到由搜查产生的阿雷尔节点的阿雷尔节点。

这允许你使用age_eq和所有其他洗劫谓词,就像它是一个常规的数据库列。



文章来源: Undefined method error for filtering by age using Ransack gem