2011-01-24 65 views
2

這怎麼可能?我在控制檯中完成的所有工作都是創建這些對象並將它們關聯起來。這對我來說沒有意義。 p.jobs.first和j是一樣的東西。爲什麼title方法在j上運行,而不是在p.jobs.first上運行?Ruby on Rails瘋狂 - 在相同的對象上調用相同的方法,不同的結果...爲什麼?

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" 

注意:名稱類被抽象並與Job關聯。像這樣,兩個類都有一個輔助模塊。

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不會從您的系統中提取「真實」數據,而是使用它的memoized/cached版本。而且該緩存版本不包含標題。

它可以通過迫使p'重新加載它的依賴關係'來解決。如果p是一個ActiveRecord對象,是有reload方法:

p.reload 
p.jobs.first 

另一種可能性是,j具有本地修改,但這些都不是COMMITED - 例如,在ActiveRecord的,如果標題最初是零和設置它Ĵ不保存/重新加載,這將不會出現在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 

爲了這工作,你必須保存到數據庫並重裝號碼:

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

謝謝,你是對的。 – pendevere

+0

'p.reload!'應該是'p.reload'。 – zetetic

+0

@zetetic:感謝您的發現。我會更新我的答案。 – kikito

相關問題