Ruby on Rails Madness - Вызов одного и того же метода для одного и того же объекта, другой результат .. почему? - PullRequest
2 голосов
/ 25 января 2011

Как это возможно? Все, что я сделал в консоли - это создал эти объекты и связал их. Это не имеет смысла для меня. p.jobs.first и j - это одно и то же. Почему метод заголовка работает на j, а не на p.jobs.first?

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"

1 Ответ

6 голосов
/ 25 января 2011

Это, вероятно, проблема с отложенной загрузкой. p.jobs.first не извлекает «реальные» данные из вашей системы, а использует их запоминанную / кэшированную версию. И эта кэшированная версия не содержит заголовка.

Эту проблему можно решить, заставив p перезагрузить свои зависимости. Если p является объектом ActiveRecord, существует метод reload:

p.reload
p.jobs.first

Другая возможность состоит в том, что j имеет локальные модификации, но они не зафиксированы - например, в ActiveRecord, если заголовок изначально был nil и вы установили его на 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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...