0

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

User モデルで関数 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 になる教育のようなメソッドを定義することは可能ですか?

EDIT 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.idがであることを意味しますnil。したがって、eduメソッドの結果は空になります。

以下を使用して、データベースにレコードを作成できます。

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

ただし、eduこれは新しいレコードであり、まだどのアイテムにも関連付けられていないため、メソッドは空のコレクションを返します。

@resume.edu上記の理由により、このコードでは常に空になるため、正確に実行しようとしていることを拡張してください。

また、独自のメソッドを作成する代わりに、組み込みのRails機能を使用することを検討してください。

于 2012-04-24T09:31:06.130 に答える