2012-04-24 23 views
0

私はユーザークラスを持っていますが、それぞれhas_manyレジュームがあり、それぞれに多くのアイテムがあります。私のユーザ/ショーページでは、複数の履歴書をレンダリングしています。私の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 

私は私のUserモデルにおける機能RES定義さ:

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

をそして、それは非常によく働きました。

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

が、それは働いていない、@edu_items何に設定されていない。しかし、私は私の履歴書モデルで機能EDUと同じことをやろうとしています。特定のレジュームのidにIDを変更すると、レジュームのアイテムはすべてのレジュームを除いて正しくレンダリングされるため、このメソッドとは具体的に関係していることがわかりました。私はそれが簡単な修正だと知っている、私はちょうどこの時点であまりにも長くそれを見つめているとそれを把握することはできません。どんなアドバイスも素晴らしいだろう。

EDIT:@ makaroni4:@educations = @ user.educationsの代わりに、各レジュームのアイテムを別々にしておきたいと思います。 @educations = @ resume.educationsを作る教育のようなメソッドを定義することは可能ですか?

編集2:アドバイスをいただきありがとうございました。おそらく

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

ないクリーンなソリューション

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

が共有/ EDUが、動作しているようです:私は完全にEDU方法で離れて行って、そして部分的にローカル変数を渡すことによってそれを解決しました。

+1

標準レール関係を使用していない理由は何ですか? ( 'belongs_to'、' has_many'、...) – Romain

+0

私は午前です。具体的には、ユーザーhas_manyが再開し、has_manyアイテムとbelongs_toユーザーが再開し、アイテム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などの変数とreseduのような変数を使用すると、 smtgは正しい方法ではありません。

+0

を編集してください。これは長いコメントを入力できないので、上記の編集を参照してください。 –

+0

もちろん、educations = resume.educationsは私の例答えを編集する – makaroni4

1

eduメソッドの結果は常に空になるため、機能しません。あなたは、オブジェクトが作成され、まだデータベースに保存されていないbuildを使用する場合は

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

:あなたのコードで

あなたは履歴書オブジェクトを構築しています。つまり、@resume.idnilです。したがって、eduメソッドの結果は空になります。

あなたはデータベースのレコードを作成するには、次を使用することができ

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

しかし、それは新記録だし、それがどんなアイテムに関連付けされませんのでごedu方法はまだ、空のコレクションを返します。まだ。

このコード@resume.eduは上記の理由で常に空になるため、正確に何をしようとしているのかを十分に確認してください。

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

私はあなたのモデル構造がどのように見えるべきだと思い
+0

私は自分が何をしようとしているのか把握できたと思う。 –

関連する問題