2012-04-24 2 views
0

У меня есть класс пользователя, который has_many возобновляет, каждый из которых имеет много элементов. На моей странице users/show я делаю несколько резюме, которые работают. В моем users_controller у меня есть следующие:Как получить доступ к id в модели

def show 
... 
@resumes = @user.resumes.paginate(page: params[:page]) 
@resume = @user.resumes.build if user_signed_in? 
@resume_items = @user.res.paginate(page: params[:page]) 
@edu_items = @resume.edu.paginate(page: params[:page]) 
... 
end 

Я определил функцию Рез в моей модели пользователя:

def res 
    Resume.where("student_id = ?", id) 
end 

И это работало достаточно хорошо. Тем не менее, я пытаюсь сделать то же самое с функцией EDU в моей модели Резюме:

def edu 
    Education.where("resume_id = ?", id) 
end 

, но это не работает, @edu_items не создаются ни к чему. Теперь я знаю, что это связано с этим методом, потому что, если я изменяю идентификатор на идентификатор конкретного резюме, то элементы этого резюме отображаются правильно, за исключением каждого резюме. Я знаю, что это простое решение, я просто смотрел на него слишком долго и не могу понять. Любые советы были бы потрясающими.

EDIT: @ makaroni4: вместо того, чтобы иметь @educations = @ user.educations, я предпочел бы сохранить элементы из каждого резюме отдельно. Можно ли определить такой метод, как образование, которое будет делать @educations = @ resume.educations?

EDIT 2: Мне удалось получить то, что я пытался сделать, спасибо за совет. Я решил его покончив с методом образова в целом, и проходя локальные переменные парциальное:

<%= render :partial => 'shared/edu', :as => :educations, :locals => {:resume_educations => resume_item.educations} %> 

общий/Edu

<% if resume_educations.any? %> 
    <ol class="educations"> 
    <%= render partial: 'shared/edu_item', collection: resume_educations %> 
    </ol> 
    <%= will_paginate @educations %> 
<% end %> 

Вероятно, не самое чистое решение, но это, кажется, работает.

+1

Любые причины, по которым вы не используете стандартные отношения рельсов? ('принадлежит_то',' has_many', ...) – Romain

+0

Я. В частности, у меня есть: пользователь has_many возобновляет, возобновляет has_many элементы и принадлежит пользователю, а item belongs_to возобновляет. –

+1

Если вы создали эти отношения в своих моделях, вам не нужны эти методы. Вы можете просто выполнить '@ user.resumes.paginate' и' @ resume.items.paginate'. Вы пытаетесь выполнить работу, которую Rails уже делает для вас. – Mischa

ответ

2

Я думаю, что ваша модель структура должна выглядеть следующим образом:

class User < ActiveRecord::Base 
    has_many :resumes 

    def educations 
    Education.joins(:resume => :user).where(:users => { :id => id }) 
    end 
end 

class Resume < ActiveRecord::Base 
    belongs_to :user 
    has_many :educations 
end 

class Education < ActiveRecord::Base 
    belongs_to :resume 
end 

Таким образом, в вашем контроллере вы можете получить доступ к ним нравится:

@resumes = @user.resumes 
@educations = @user.educations # all users educations, from all resumes 

or 

@educations = @resume.educations # educations for particular resume 

А также рекомендую вам прочитать эту статью http://petdance.com/2012/04/the-worlds-two-worst-variable-names/ о переменных имена, переменные, такие как resume_items и методы res и edu следует сказать, что вы «делать smtg не в правильном направлении.

+0

Это не позволит мне вводить длинные комментарии, поэтому см. Править выше –

+0

Конечно, education = resume.educations будет работать с моим примером, проверьте мои отредактировать ответ – makaroni4

1

Это не работает, потому что результат вашего метода edu всегда будет пустым.

В своем коде вы строите резюме объекта:

@resume = @user.resumes.build if user_signed_in? 

При использовании build создается объект, но не сохраняются в БД. Это означает, что ваш @resume.id - nil. И таким образом результат вашего метода edu будет пустым.

Вы можете использовать следующие действия для создания записи в базе данных:

@resume = @user.resumes.create if user_signed_in? 

Но ваш метод edu будет возвращать пустую коллекцию, потому что это новый рекорд, и это не будет связано с какими-либо предметов все же.

Пожалуйста, объясните, что вы пытаетесь сделать точно, потому что с этим кодом @resume.edu всегда будет пустым по причине, описанной выше.

Также: рассмотрите возможность использования встроенной функции Rails вместо создания собственных методов.

+0

Я думаю, мне удалось выяснить, что я пытаюсь сделать .. См. Править выше –

Смежные вопросы