0

我有一个用户类,其中有很多简历,每个都有很多项目。在我的用户/显示页面上,我呈现了多份简历,这是有效的。在我的 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

这工作得很好。但是,我正在尝试对我的 Resume 模型中的函数 edu 做同样的事情:

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

但它不起作用,@edu_items 没有被设置为任何东西。现在我知道它与这个方法特别有关,因为如果我将 id 更改为特定简历的 id,则该简历的项目将正确呈现,除了每个简历。我知道这是一个简单的解决方法,此时我已经盯着它看了太久,无法弄清楚。任何建议都会很棒。

编辑:@makaroni4:我不想让@educations = @user.educations,而是将每个简历中的项目分开。是否可以定义一种方法,例如使@educations = @resume.educations 的教育方法?

编辑2:我设法让我想做的工作,谢谢你的建议。我通过完全取消 edu 方法并将局部变量传递给局部变量来解决它:

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

共享/教育

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

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

4

2 回答 2

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和方法resedu应该说你'重新做 smtg 的方式不对。

于 2012-04-24T09:38:58.727 回答
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 功能而不是创建自己的方法。

于 2012-04-24T09:31:06.130 回答