RoR ActiveResource вложенные ресурсы: разница между 3.2.1 и 3.0.7 - PullRequest
2 голосов
/ 27 февраля 2012

У меня есть две простые модели, clown.rb и funny_hat.rb.

ARes 3.0.7

clown = Clown.new({:funnyHats => [{ :id => "123" },{ :id => "456" }]})
p clown
#<Clown:0x3091b721 @prefix_options={},
@attributes={"funnyHats"=>[#<FunnyHat:0x7fd8623b @prefix_options={}, @attributes={"id"=>"123"}>, #<FunnyHat:0x3f18dc75 @prefix_options={}, @attributes={"id"=>"456"}>]}>

ARes 3.2.1

clown = Clown.new({:funnyHats => [{ :id => "123" },{ :id => "456" }]})
p clown
#<Clown:0x1f38b39c @prefix_options={}, @persisted=false, 
@attributes={"funnyHats"=>[#<Clown::FunnyHat:0xbd8632b @prefix_options={}, @persisted=false, @attributes={"id"=>"123"}>, #<Clown::FunnyHat:0x44adf91a @prefix_options={}, @persisted=false, @attributes={"id"=>"456"}>]}>

Кажется, есть разница с вложенными ресурсами с ARes 3.2.1 от ARes 3.0.7. Обратите внимание, как в ARes 3.2.1 выводятся узлы «Clown :: FunnyHat». Я вспоминаю это с ARes 3.0.7, когда не было объявлено модели FunnyHat.rb.

Вопрос: Это проблема, которую можно обойти?

Обновление

Если я сделаю следующее в ARes 3.2.1, я получу другой результат.

funny_hat = FunnyHat.new()
clown = Clown.new({:funnyHats => [{ :id => "123" },{ :id => "456" }]})
p clown
#<Clown:0x506d043e @prefix_options={}, @persisted=false, 
@attributes={"funnyHats"=>[#<FunnyHat:0x70596c33 @prefix_options={}, @persisted=false, @attributes={"id"=>"123"}>, #<FunnyHat:0x381ba0c6 @prefix_options={}, @persisted=false, @attributes={"id"=>"456"}>]}>

Причина, по которой это имеет значение, заключается в том, что если узел является "Clown :: FunnyHat", он не отображается на модель "FunnyHat", и поэтому экземпляры не имеют каких-либо методов или атрибутов экземпляра "FunnyHat". "объект.

Другой промежуточный хак

Поместите следующее в некоторый шаг инициализатора или before_filter

Dir.glob("#{Rails.root}/app/models/*.rb").sort.each { |file| require_dependency file }

Спасибо https://github.com/rails/rails/issues/5148

Я начинаю думать, что ActiveResource 3.2.1 является серьезной регрессией по сравнению с ActiveResource 3.0.7.

...