Listowanie przez relacje through

Mam 4 następujące modele:

class User < ActiveRecord::Base
      has_many :messages
      has_many :user_teams
      has_many :teams, :through => :user_teams
      has_many :project_admins
      has_many :ordered_projects
      has_many :projects
end

class UserTeam < ActiveRecord::Base
  belongs_to :user
  belongs_to :team
end

class Team < ActiveRecord::Base
  has_many :projects
  has_many :user_teams
  has_many :users, :through => :user_teams
end

class Project < ActiveRecord::Base
  has_many :messages
  belongs_to :team
  has_one :project_admin
  has_one :ordered_project
  belongs_to :user
end

Każdy project ma jednego użytkownika, który utworzył nowy projekt(Project belongs_to :user), każdy projekt jest przypisany do teamu w którym może być wielu użytkowników.

Teraz chciałbym wylistować wszystkie projekty danego usera, do których należy przez team.
Zrobiłem to w taki sposób:

class User < ActiveRecord::Base

  def get_projects
    teams_id = []
    self.teams.each {|team| teams_id << team.id}
    Project.where(:team_id => teams_id)
  end

end

ale jako, że się uczę zastanawiam się czy nie ma na to jakiegoś bardziej eleganckiego rozwiązania?

Tak na szybko, to powinno zadziałać coś takiego (bo user powinien mieć metodę team_ids dla relacji z teamami):

Project.where(team_id: team_ids)

Pewnie z joinami też się alternatywnie da, choć dla większej ilości danych raczej będzie wolniejsze:

Project.joins(team: :users).where(users: { id: id })
1 Like