each dans un helper

Ce sujet est résolu
17372
,

Bonjour,

Je débute encore en ruby on rails, et j'ai un probleme, je ne comprends pas mon probleme mais je sais pourquoi cela fais ca.

Alors voila dans ma vue, j'ai:

- Task.where(["assigned_to = ? and is_closed = ?", current_user.id, 0]).each do |task|
    - Project.where(:id => task.project_id).each do |project|
        = render 'projects/project', :project => project

et ce que j'essai de faire c'est de mettre les deux premieres ligne dans une fonction dans un fichier helper.

Je suis arrivé a faire ca :

- projects_current_user(current_user.id).each do |project|
    = render 'projects/project', :project => project
def projects_current_user(current_user)
        tasks = Task.where(["assigned_to = ? and is_closed = ?", current_user.id, 0])
        tasks.each do |task|
            return Project.where(:id => task.project_id)
        end
    end

ce qui fonctionne plutôt bien si l'on ne veux u'une seul valeur. J'ai donc essayer de faire un tableau :

def projects_current_user(current_user)
    projects = Array.new
        tasks = Task.where(["assigned_to = ? and is_closed = ?", current_user.id, 0])
        tasks.each do |task|
            projects << Project.where(:id => task.project_id)
        end
        return projects.uniq
    end

mais cela ne fonctionne pas et je ne sais pas quoi faire de plus.
Si vous avez un peu de temps je voudrais bien savoir comment faire cette petite fonction.

Merci,
des bisous.

4 Réponse

1
,

Le code que tu montre ici a plus sa place dans un model. Après je ne comprend pas ta logique, tu va faire des tonnes de requetes si tu fais comme ça.

def projects_current_user(current_user)
        # On récupre la liste des projets [id1, id2..] 
        project_ids = Task.where(["assigned_to = ? and is_closed = ?", current_user.id, 0]).pluck(:project_id) 
        return Project.where(:id => project_ids)
end

La méthode pluck permet de ne charger qu'un champs dans un tableau

17372
,

Dans l'état actuel, c'est un peu le mode "je test des trucs et je vois si ca fonctionne". Pratique ce pluck. Est ce que .collect c'est la même chose ?

1
,

collect se fait côté ruby après que ta requête soit faite
pluck se fait côté base de données du coup il ne va sélectionner que le champs demandé lors de la requête

17372
,

Mmmmh ok cool Merci.