我有一个用户类,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 %>
可能不是最干净的解决方案,但似乎有效。
答案 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.id
为nil
。因此,edu
方法的结果将为空。
您可以使用以下命令在数据库中创建记录:
@resume = @user.resumes.create if user_signed_in?
但是你的edu
方法仍然会返回一个空集合,因为它是一个新记录,它还不会与任何项目相关联。
请详细说明您要执行的操作,因为由于上述原因,此代码@resume.edu
将始终为空。
另外:考虑使用内置的Rails功能,而不是制作自己的方法。