如何从 has_many 关系中累积结果?

How to accumulate results from has_many relationship?

我想从选定的 projects 中获取所有 boards 的列表,只需一行代码:

boards = projects.boards

怎么做?

目前我在每个项目上单独迭代,获取它的板并在数组中累积结果(代码如下)

class Project < ActiveRecord::Base
  has_many :boards
end

class Board < ActiveRecord::Base
  belongs_to :project
end

class Account < ActiveRecord::Base
  has_many :projects
end

projects = @account.projects.where("SOME_CONDITION")

# my current code:
boards = []
projects.each do |project|
  boards << project.boards
end

# wanted code:
boards = projects.boards # <--- How to achieve it?

使用此语法

项目=@account.projects.where("SOME_CONDITION").last.boards

您可以使用 includes AR 语句来获取与每个项目相关的所有看板

Project.a_scope.includes(:boards).each do |project|
  projects.boards.do_something
end

将使用两个 SQL 查询获取与您想要的项目相关的所有板。

select * from projects where ...

select * from boards where boards.project_id in (1,2,3,4...)

如果您只想要一个看板列表,您可以自己完成

project_ids = Project.a_scope.pluck(:id)
boards = Board.where(id: project_ids)

如果我没记错的话,你想要一个帐户的项目的看板。您需要向模型中添加更多行。

1.

class Project < ActiveRecord::Base  
   has_many :boards  
   belongs_to :account   
end

2.

class Board < ActiveRecord::Base
   belongs_to :project  
   belongs_to :account, through: project  
end

3.

class Account < ActiveRecord::Base
   has_many :projects
   has_many :boards, through: :projects

   def projects_boards(project_ids)  
     self.boards.where(boards.project_id: project_ids)  
   end  
end

然后就这样称呼它:
boards= @account.boards
根据您的需要编辑电话:
boards = @account.projects_boards(projects.map(&:id))

class Project < ActiveRecord::Base
  has_many :boards
end

class Board < ActiveRecord::Base
  belongs_to :project
end

class Account < ActiveRecord::Base
  has_many :projects
  has_many :boards, through: :projects
end

随便说说

SOME_CONDITION = "projects.state = 'active'"

只需使用这个:

@account.boards.where(SOME_CONDITION)