0

次のようなJSONをエクスポートするRails APIがあります

# /customers/1.json
{
  "id":1,
  "name":"Some name","address":"Street 12-3",
  "county":{"id":2,"name":"MyCounty"},
  "contracts":[
    {"id":2663,"number":"6-2/7 (2011)", "county":{"id":2,"name":"MyCounty"}},
}

クライアント Rails ( 3.2.2 ) には Resource models:CustomerContractあり、Countyすべてその API に接続されています。をフェッチCustomer.find(1)すると、元のクラスが既にロードされているかどうかに基づいて、関連するオブジェクトが 2 つの異なるクラスに解析されるようです。

検討:

rails console
c = Customer.find 1
#<Customer:0x0... @attributes={"id"=>1, "county"=>#<County:0x0...>,
"contracts"=>[#<Customer::Contract:0x0...> ....

注:関連クラス名:CountyおよびCustomer::Contract

コンソールをリロードすると、次のようになります。

reload!
c = Customer.find 1
#<Customer:0x0... @attributes={"id"=>1, "county"=>#<Customer::County:0x0...>,
"contracts"=>[#<Customer::Contract:0x0...> ....

しかし、新しいコンソールを起動し、Rails にクラスをロードさせる前に、次のようにします。

rails console
County.new
Contract.new
c = Customer.find 1
#<Customer:0x0... @attributes={"id"=>1, "county"=>#<Customer::County:0x0...>,
"contracts"=>[#<Contract:0x0...> ....

Railsがこれらを常に同じ方法で解析できるようにする方法はありますか?

編集:コード例:

# app/models/contract.rb
class Contract < ActiveResource::Base
  self.site = APP_CONFIG['k2api']
  self.format = :json
end

# app/models/customer.rb
class Customer < ActiveResource::Base
  self.site = APP_CONFIG['k2api']
  self.format = :json
  # accessor to ActiveResource response headers
  add_response_method :http_response
end

# app/models/county.rb
class County < ActiveResource::Base
  self.site = APP_CONFIG['k2api']
  self.format = :json
end
4

1 に答える 1

0

Rails ActiveResource sourceを読むと、答えは私が疑い始めたとおりです。Rails は、関連付けの名前を持つクラスが既に定義されているかどうかを確認するか、単純なActiveResource::Baseサブクラス自体を作成します。

モデルがロードされているかどうかに関係なく、アプリが一貫して動作するようにするために、イニシャライザですべてのリソース モデルを強制的にロードします。

[Customer, Contract, County].map &:new

ところで、何らかの理由で、このSOの質問で言及されている熱心な読み込みにより、Factory Girlに問題が発生しました。

于 2012-08-21T10:13:58.780 に答える