2

在我的数据库中,我在用户和角色之间建立了多对多关系 ( HABTM )。我正在尝试获取与特定秘书关联的用户的所有角色名称。

我设法将以下内容拼凑在一起:

class Secretary < ActiveRecord::Base
  def getRoles
    rolenames = Set.new
    Role.all.map { |role| role.users.map { |user| rolenames << role.name if user.manager.secretary == self } }
    rolenames.to_a
  end
end

...这行得通,但似乎一个精心设计的“where”语句应该产生相同的结果,而不会对数据库造成太多影响。

是否可以将上述内容转换为更“本机”的 ActiveRecord 查询?

4

2 回答 2

1

您没有提供足够的信息来清楚地了解您的模型。根据您提供的内容,我猜从秘书的角度来看是这样的:

Secretary
 has_many :managers

Manager
 has_namy :users

User
 has_many :roles

从深度嵌套的模型中检索记录时,根据 id(外键)进行思考会很有帮助:Rails Nested SQL Queries

由于 Rails 在 where 语句的哈希版本中自动为您将记录转换为 id。

Role.where(:user_id => User.where(:manager_id => managers))

如果我对您的模型的假设是正确的,应该得到您的答案。

编辑:好的,HABTM 有点混淆了水。我们不能做嵌套 where's 但我们仍然可以做一个 where 以及一些映射,而不会对数据库造成太大的影响。尝试这个:

User.includes(:roles).where(manager_id: managers).flat_map(&:roles).map(&:name)
于 2013-08-29T17:49:38.607 回答
0

您的模型似乎是这样的:

Role 
  has_many :users
User 
  belongs_to :role 
  has_one :manager, :class => 'User'

在这种情况下,只需内部连接表格即可恢复您所追求的结果:

SELECT roles.* FROM roles
INNER JOIN users u ON u.role_id = roles.id
INNER JOIN users m ON m.id = u.id

这个查询可以翻译成这样的:

Role.joins(:users => :manager)
于 2013-08-28T18:14:33.090 回答