ruby-on-rails 按类别搜索和展示

1u4esq0p  于 2023-10-21  发布在  Ruby
关注(0)|答案(1)|浏览(120)

我想根据用户的类型显示用户,所以在用户概述页面上我有三个标题:管理员/版主/成员。在每个标题下,我显示了属于该组的用户。所以我查询user_type并找到属于这个组的所有用户。
每个人都在某个公司工作。我正在创建一个过滤器,使用ransack来过滤该公司:

= f.input :users_company_id_in, collection: Company.order(:name), label: 'Company'

在我的控制器中,我像这样使用ransack:

def index
    @q = UserType.includes(:users, :active_users).ransack(params[:q])
    @user_types = @q.result(distinct: true)
  end

因为在我看来,我是通过使用@user_types.users获取用户的,所以这个查询不考虑ransack参数,所以我看到的是每个类别的所有用户,每个类别都有人为该公司工作。
我试图实现的显然是只看到为特定公司工作的用户,并且只显示特定的user_type,如果过滤后该类别中有人的话。
如何实现这一点有什么想法吗?

kqqjbcuj

kqqjbcuj1#

我在一个项目中遇到了类似的问题。以下是您需要采取的大致步骤:
在控制器中,将index操作更改为:

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

这将告诉Ransack搜索users,而不是user_types
在您看来,将获取用户的代码更改为:

@users = @q.result.where(company_id: params[:users_company_id_in])

这将通过在参数中传递的公司ID过滤用户。
如果你想在过滤后只显示某个user_type,如果类别中有人,你可以用before过滤器来做到这一点:Ruby

before_filter :check_user_type

def check_user_type
  if params[:users_user_type_id].present?
    @user_type = UserType.find(params[:users_user_type_id])
    if @user_type.users.empty?
      flash[:alert] = "There are no users of this type."
      redirect_to users_path
    end
  end
end

这个before过滤器将检查用户是否在参数中指定了user_type ID。如果有,它将通过该ID查找user_type,并检查是否有任何该类型的用户。如果没有该类型的用户,它将 Flink 一条警报消息并将用户重定向到用户页面。

相关问题