【问题标题】:How does ransack search works on an array list?ransack 搜索如何在数组列表上工作?
【发布时间】:2018-01-12 06:48:18
【问题描述】:

我正在使用 Rails 4.2.5、Ruby 2.2、ransack。 我正在尝试使用 Ransack 实现搜索功能。我有类似的东西:

emails = ["abc@abc.com", "a@a.com", "b@b.com"]
users_list = emails.map{|a| User.where(email: a).first}
checked_in_users = Kaminari.paginate_array(users_list)

这为我提供了页面中正确的用户列表。但是如果我想通过电子邮件搜索,我该怎么办?

@q = checked_in_users.ransack params[:q]

这给了我:

"NoMethodError (undefined method `ransack' for #<Array"

HAML 代码:

= search_form_for [@q], url: users_path(some_id: id) do |form|
  = form.text_field :user_name_or_user_email_cont, placeholder: 'Name or email', class: 'form-control'

使用 ransack 的正确方法是什么?

【问题讨论】:

    标签: ruby-on-rails-4 ransack


    【解决方案1】:

    如果你想搜索整个用户列表,你可以这样做:

    @q = User.ransack(params[:q])
    @users = @q.result.page(params[:page])
    

    您想在添加分页之前在您的模型上调用ransack。一旦你得到了搜查结果,你就可以添加分页。文档的这一部分向您展示how to handle pagination with ransack。最基本的形式是how you can use ransack


    此外,您的示例中似乎有一些奇怪的代码。抱歉,如果我误解了您要执行的操作。

    当您调用emails.map{|a| User.where(email: a).first} 时,在这种情况下您将进行 3 次 where 查询并返回一个包含 3 个模型的数组。 Ransack 不会对该数组进行操作。

    在你的情况下,我会把它改成这样的:

    emails = ["abc@abc.com", "a@a.com", "b@b.com"]
    @q = User.where(email: emails).ransack(params[:q])
    @checked_in_users = @q.result.page(params[:page])
    

    只要知道您会从一组电子邮件用户中搜索“abc@abc.com”、“a@a.com”和“b@b.com”。如果您使用搜索表单搜索“bob@example.com”,您将不会得到任何搜索结果。这可能不是你想要的。

    【讨论】:

    • 嗨@Derek ...第二个答案对我有用。虽然我对此有另一个问题。我不知道我应该把它贴在这里还是打开一张新票。我在用户以外的不同控制器和不同视图中编写上述代码。使用上面的列表,我收到了这个错误:ActionView::Template::Error (undefined method `user_name_or_user_email_cont' for Ransack::Search>:Ransack::搜索):
    • @Avinash 您的用户模型上有哪些列?如果您需要发布更多详细信息,您可能需要打开一个新问题。
    • 当然,我会打开一个新问题并在此处发布链接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-17
    • 1970-01-01
    • 1970-01-01
    • 2016-02-26
    • 2020-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多