I have a rails app that I recently updated to Rails 5. I have a data model that looks like this (simplified): Users
can have many Apps
, Users
can also be a Member
of multiple Team
s, each Team
can also have multiple App
s. In my App
s index view / controller I want to list all the users apps that he / she have created, I also want to list all the apps that belongs to Team
s that the Users
is a Member
of.
I have a feeling that there is a nicer and more performant way to do it than my current implementation (possibly something new in Rails 5). This is how my current implementation looks:
apps = []
# First get all the team apps where the user is a member, but haven't created the app.
current_or_guest_user.teams.each do |team|
team.apps.each do |app|
unless app.user.eql?(current_or_guest_user)
apps << app
end
end
end
# ... then get all the apps that the user have created.
current_or_guest_user.apps.each do |app|
unless apps.include?(app)
apps << app
end
end
# Return the apps.
@apps = apps
So, is there a cleaner and more optimal way to do what I'm doing? And how does that look?
Edit
This is how my active model associations looks like:
# App.rb
belongs_to :user
belongs_to :team
# User.rb
has_many :apps, dependent: :destroy
has_many :teams
has_many :teams, through: :members
# Team.rb
has_many :apps, dependent: :destroy
Edit 2
I wonder if the Rails 5 method #or
(https://github.com/rails/rails/pull/16052) could be used in this use case, something like:
current_user.apps.or([...]])
# [...] = In not exactly sure what to put here in that case.
Aucun commentaire:
Enregistrer un commentaire