J'essaie de créer une liste d'enregistrements avec les attributs des enregistrements associés. Être Task
goal
Attribut Hériter \ remplacer Power
-goal
AttributComment accéder aux attributs de la table jointe (has_many: through) à partir de l'association
si nous avons:
@tasks = user.tasks
lorsque nous rendions la vue
<%= render @tasks %>
Tout va bien, nous pouvons simplement utiliser <%= task.goal %>
dans le partiel et tout fonctionne, mais si nous avons user.super_tasks
comment remplacer l'objectif dans le partiel?
La première chose qui vient à l'esprit est de faire dans le _task.htm.erbl
<%= goal = if @super_tasks then task.powers.find_by(user_id: current_user).goal else task.goal end %>
Il est fait genre de celui-ci, mais ok si vous avez 3 disques, avec 15, il fera 15 demande à db pour trouver la table de jointure à chaque fois.
venons d'ajouter les tables pour le rendre plus clair:
class User < ActiveRecord::Base
has_many :tasks
has_many :powers
has_many :super_tasks , through: :powers, source: :task
end
class Task < ActiveRecord::Base
belongs_to :user
has_many :powers
end
class Power < ActiveRecord::Base
belongs_to :user
belongs_to :tasks
end
Mais si l'utilisateur le pouvoir, ils ont plus de responsabilités, ce ne est pas la première fois que je coincé sur ce problème, bien sûr il y a d'autre moyen de faire ce travail sans appeler le db à chaque fois, comme c'est malheureusement un problème commun.
Voir [Actif Record Query Interface - Rejoindre des tables] (http://guides.rubyonrails.org/active_record_querying.html#joining-tables) et [Active Record Query Interface - Eager-loading Associations] (http://guides.rubyonrails.org/active_record_querying .html # eager-loading-associations) –
Même si vous "rejoignez" ou "Eager-loading", vous devrez parcourir tous les enregistrements, par exemple: <% task.powers.each do | pw | %> <% si pw.user_id == current_user.id%> <% = pw.goal%> <% end %> <% end %> cela fonctionnera, mais ce n'est pas la manière propre que je cherchais. – GEkk