gpt4 book ai didi

ruby-on-rails - 跨三个模型的 ActiveRecord 查询?

转载 作者:行者123 更新时间:2023-12-04 06:06:16 26 4
gpt4 key购买 nike

我有三个模型:

class User < ActiveRecord::Base
has_many :projects, :through => :permissions

class Permission < ActiveRecord::Base
belongs_to :user
belongs_to :project
belongs_to :role

class Project < ActiveRecord::Base
has_many :users, :through => :permissions

使用上面的方法很容易获得项目的所有用户:@project.users

但我想要做的是得到这样的东西:获取所有用户项目中的所有用户。

所以如果一个用户有 3 个项目,每个项目有 5 个用户。我想查询以获取所有用户组中的所有 15 个用户。

我正在尝试。

 current_user.projects.users 

但是 Rails 不是很喜欢。 current_user.projects 效果很好,但不是用户。

建议?想法?谢谢!

根据 noodl 的评论更新代码 3

  scope :suggestedContacts, lambda { |user|
users_from_projects = user.projects.reduce([]) {|all_users,prj|
all_users + prj.users
}.uniq
}

错误:

NoMethodError(# 的未定义方法“includes_values”):

最佳答案

我的两个解决方案是:

  • 干净,简单的标准 rails 元代码,无自定义查找器
  • 高效,在一个 SQL 查询中提取,没有 N+1 问题
  • 合规,这意味着您仍然可以在关系上构建、创建等

1.

您可以在用户类中链接您的关系。
由于 rails 3.0.x 还不支持嵌套的 has_many_through 你可以使用 this插件直到 rails 3.1

class User < ActiveRecord::Base
has_many :permissions
has_many :projects, :through => :permissions
has_many :users_in_projects, :through => :projects, :source => :user # chain the relation

class Permission < ActiveRecord::Base
belongs_to :user
belongs_to :project

class Project < ActiveRecord::Base
has_many :users, :through => :permissions

current_user.users_in_projects

2.

另一种方法是预先加载和减少(就像其他答案已经描述的那样,但我会更明确)。
这是更多的工作,更少的依赖。

class User < ActiveRecord::Base
has_many :permissions
has_many :projects, :through => :permissions, :include => :users # eager load users

class Permission < ActiveRecord::Base
belongs_to :user
belongs_to :project

class Project < ActiveRecord::Base
has_many :users, :through => :permissions

current_user.projects.map(&:users).reduce(&:+).uniq_by(&:id)
# returns users in current_user's projects, one query, some computations

关于ruby-on-rails - 跨三个模型的 ActiveRecord 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4762142/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com