在rails应用程序中使用Ransack搜索表单中的关联多对多关联

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在rails应用程序中使用Ransack搜索表单中的关联多对多关联相关的知识,希望对你有一定的参考价值。

在我的狂欢应用程序中,我为用户提供了基于ransack的搜索表单,如下所示

<%= search_form_for [:admin, @search], url: admin_users_url do |f| %>
      <div class="field">
        <%= f.label :email_cont, Spree.t(:email) %> <br>
        <%= f.text_field :email_cont, :class => 'fullwidth' %>
      </div>
      <div class="field">
        <%= f.label :first_name_cont, Spree.t(:first_name) %> <br>
        <%= f.text_field :first_name_cont, :class => 'fullwidth' %>
      </div>
      <div class="field">
        <%= f.label :last_name_cont, Spree.t(:last_name) %> <br>
        <%= f.text_field :last_name_cont, :class => 'fullwidth' %>
      </div>
      <div data-hook="admin_users_index_search_buttons">
        <%= button Spree.t(:search_users), 'search' %>
      </div>
 <% end %>

在我的控制器中我有

Spree::Admin::UsersController.class_eval do
  def index
    @users = Spree::User.all.order(:email).
      ransack(params[:q]).
      result.
      page(params[:page]).
      per(params[:per_page])
   end
end

现在,spree_user可以有多个角色,角色类由spree定义如下

module Spree
  class Role < Spree::Base
    has_many :role_users, class_name: "Spree::RoleUser", dependent: :destroy
    has_many :users, through: :role_users
  end
end

有一个表spree_roles_users将用户连接到角色。我想在搜索表单中添加一个下拉选择字段,列出所有至少有一个属于它的用户的角色,并使用指定的角色进行搜索。我知道我必须在表单中添加角色下拉列表中的collection_select,但我不确定如何在这种情况下使用它。我在表单中添加了以下内容

<%= f.collection_select :spree_roles_ids, Spree::Role.all, :id, :name %>

但它给出了错误undefined method 'spree_roles_ids' for #<Ransack::Search:0x00561a6a02a370>

我怎样才能解决这个问题 ?

谢谢

答案

首先你需要为spree_roles模型列入User关联白名单你可以通过在spree.rb中添加以下代码来实现

Rails.application.config.to_prepare do
  Spree.user_class.whitelisted_ransackable_associations.push('spree_roles')
end

现在以ransack形式

<%= f.collection_select :spree_roles_id_eq, Spree::Role.all, :id, :name %>

请注意我使用spree_roles_id_eq而不是spree_roles_id,因为你必须告诉你搜索你的匹配条件。在这种情况下,我正在查询平等条款。

希望这可以帮助。

以上是关于在rails应用程序中使用Ransack搜索表单中的关联多对多关联的主要内容,如果未能解决你的问题,请参考以下文章

Rails,Ransack:如何在 HABTM 关系中搜索“所有”匹配项而不是“任何”匹配项

标头部分中的 ransack 搜索表单:未向 search_form_for 提供 Ransack::Search 对象

在 Ransack 上为 Rails 设置默认搜索参数

Ransack,搜索多列,一个字段,rails 3

Rails Ransack gem:使用一个条件搜索多个值

Ruby on Rails Ransack Datetime 到日期搜索