如何在模型中访问id

时间:2012-04-24 08:52:08

标签: ruby-on-rails ruby ruby-on-rails-3

我有一个用户类,has_many简历,每个都有很多项。在我的用户/节目页面上,我渲染了多个简历,这是有效的。在我的users_controller中,我有以下内容:

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

我在用户模型中定义了函数res:

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

这很有效。但是,我正在尝试使用我的简历模型中的函数edu执行相同的操作:

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

但它不起作用,@ edu_items没有被设置为任何东西。现在我知道它具体与此方法有关,因为如果我将id更改为特定简历的id,那么恢复的项目将被正确呈现,除了每个简历。我知道这是一个简单的修复方法,我此时已经盯着它看了太长时间并且无法弄明白。任何建议都会很棒。

编辑:@ makaroni4:我宁愿将每份简历中的项目分开来,而不是让@educations = @ user.educations。是否有可能定义一个像@educations = @ resume.educations那样的教育方法?

编辑2:我设法得到了我想要做的工作,感谢您的建议。我通过完全取消edu方法并将局部变量传递给partial:

来解决它
  <%= 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 %>

可能不是最干净的解决方案,但似乎有效。

2 个答案:

答案 0 :(得分: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。

答案 1 :(得分:1)

它不起作用,因为edu方法的结果将始终为空。

在您的代码中,您正在构建一个简历对象:

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

如果使用build,则会创建一个对象,但尚未保存到数据库中。这意味着您的@resume.idnil。因此,edu方法的结果将为空。

您可以使用以下命令在数据库中创建记录:

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

但是你的edu方法仍然会返回一个空集合,因为它是一个新记录,它还不会与任何项目相关联。

请详细说明您要执行的操作,因为由于上述原因,此代码@resume.edu将始终为空。

另外:考虑使用内置的Rails功能,而不是制作自己的方法。