2011-01-24 7 views
2

これはどのように可能ですか?私がコンソールで行ったことは、これらのオブジェクトを作成して関連付けることだけです。これは私には意味がありません。 p.jobs.firstとjは同じものです。タイトルメソッドがjで動作し、p.jobs.firstで動作しないのはなぜですか?Ruby on Railsの狂気 - 同じオブジェクトで同じメソッドを呼び出す、別の結果..why?

ruby-1.9.2-p136 :031 > p 
=> #<Person id: 14, type: "Person", desc: nil, created_at: "2011-01-24 23:53:13", updated_at: "2011-01-24 23:53:13"> 
ruby-1.9.2-p136 :032 > p.jobs.first 
=> #<Job id: 18, type: "Job", created_at: "2011-01-24 23:53:36", updated_at: "2011-01-24 23:53:36", entity_id: nil, person_id: 14, company_id: 15> 
ruby-1.9.2-p136 :033 > p.jobs.first.title 
=> nil 
ruby-1.9.2-p136 :034 > p.title 
=> nil 
ruby-1.9.2-p136 :035 > j 
=> #<Job id: 18, type: "Job", created_at: "2011-01-24 23:53:36", updated_at: "2011-01-24 23:53:36", entity_id: nil, person_id: 14, company_id: 15> 
ruby-1.9.2-p136 :036 > j.title 
=> "dfkjld" 

注:名前クラスは抽象化され、ジョブに関連付けられています。そのようなクラスにはヘルパーモジュールが含まれています。

def title 
    if class_name == "Job" 
     name.value 
    elsif class_name == "Person" 
     if jobs.empty? then "Unemployed" else jobs.first.title end 
    else 
     nil 
    end  
    end 

ruby-1.9.2-p136 :015 > j.name 
=> #<Name id: 16, kind: nil, value: "dfklj", name_id: nil, event_id: 19, instrument_id: nil, transaction_id: nil> 
ruby-1.9.2-p136 :016 > j.name.value 
=> "dfklj" 
+0

'title'はあなたの' Job'モデルの属性ではないようです。どのように定義されていますか? – cam

答えて

6

これはおそらく遅延読み込みの問題です。 p.jobs.firstは、あなたのシステムから「メモ」された/キャッシュされたバージョンを使用して、実際のデータを引き出しません。キャッシュされたバージョンにはタイトルが含まれていません。

pに「依存関係をリロードする」ことを強制することで解決できます。 pはActiveRecordのオブジェクトである場合、reload方法がある:

p.reload 
p.jobs.first 

別の可能性は、jはローカルの変更がありますが、これらはコミットされていないということである - 例えば、ActiveRecordの中で、タイトルが最初にゼロだった場合、あなたが設定それリロード/保存せずにJに、それはp.jobs.firstには表示されません。

> p.jobs.first.title 
nil 
> j = Jobs.find(1) # same job as p.jobs.first.title 
... 
> j.title = 'blah' 
'blah' 
> j.title 
'blah' 
> p.jobs.first.title 
nil 

それが動作するためには、データベースに保存し、Pをリロードする必要があります。

> j.save 
true 
> p.reload 
p.jobs.first.title 
> 'blah' 
+0

ありがとうございます。 – pendevere

+0

'p.reload!'は 'p.reload'でなければなりません。 – zetetic

+0

@zetetic:それを見つけてくれてありがとう。私は私の答えを更新します。 – kikito

関連する問題