0

J'essaie de créer une liste d'enregistrements avec les attributs des enregistrements associés. Être Taskgoal 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.

+0

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) –

+0

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

Répondre

0

Ok peut-être pas la meilleure solution, mais il fonctionne et répond à la question:

tasks = user.tasks.order(:id) 
power_tasks = user.powers.order(:task_id) 

tasks.each_with_index do |task,i| 
    task.goal = power_tasks[i].goal 
end 

Le point faible si ce code est, si nous disons qu'il n'y a pas task_id commander \ régler le power ou si le numéro power_tasks ne correspond pas aux tâches. Mais pour mon cas cela a fonctionné parfaitement.

Si vous souhaitez ajouter d'autres param, qui n'existez sur Task normal, mais existez sur Power table et vous souhaitez l'ajouter à tasks aussi, puis dans le modèle que nous pouvons:

class Task < ActiveRecord::Base 
    attr_accessor :cookies 

task.cookies = power_tasks[i].cookies