通过rails中的多对多关系进行过滤

时间:2014-06-25 21:11:12

标签: ruby-on-rails pagination many-to-many

堆栈溢出有很多“has_many”rails问题,但没有什么是我需要的。我有三个模型:Users,OrganizationUsers和Organizations。它们看起来像这样:

class User < ActiveRecord::Base
  has_many :organization_users #the model relating User and Organization
  has_many :organizations, through: :organization_users

并且

class Organization < ActiveRecord::Base
  has_many :organization_users
  has_many :users, through: :organization_users
end

并且

class OrganizationUser < ActiveRecord::Base
  belongs_to :user
  belongs_to :organization
end

我想要做的很多挫折是,如果用户是管理员且管理员的组织与用户的组织匹配,则仅向当前用户显示用户。所以我将举例说明我尝试的那些无效的想法(来自users_controller.rb):

admin_users << User.where(current_user.organizations.all.include? :organization )

显然这不起作用,但我认为它显示了我想要做的事情。更复杂的是,我真的想使用paginate ,这显然不喜欢将strait up数组作为参数,所以我希望如果可能的话,纯粹使用过滤器。

提前致谢。

2 个答案:

答案 0 :(得分:1)

您没有说出如何定义管理员,但假设用户模型上有一个简单的管理员布尔值,您可以查询当前用户组织中的所有管理员,如下所示:

User.includes(:organizations).where('organization_users.organization_id' => current_user.organization_ids, :admin => true)

答案 1 :(得分:0)

我会尝试:

OrganizationUser.where(user_id: current_user.id).joins(:user).where(user: {admin: true}).includes(:user).map(&:user)
  1. 获取所有OrganizationUser匹配的当前用户,以获取其所有组织
  2. 加入users表,只选择管理员(我假设users表中有一个布尔值,如果不同则更改)
  3. 获取每个User过滤前的<{li}的OrganizationUser个对象