2

2つの結合モデルを使用しています

class Product < ActiveRecord::Base
  has_and_belongs_to_many :providers
end
class Provider < ActiveRecord::Base
  has_and_belongs_to_many :products
end

私のコントローラーは次のようになります

class ProductsController < ApplicationController
    @products = Product.find( 
      :all, 
      :joins => :providers, 
      :select => "providers.id, providers.title, products.id, products.title, products.price", 
      :limit => 10)
    respond_to do |format|
      format.xml  { render :xml => @products }
      format.json { render :json => @products }
    end
  end
end

@products が期待どおりにレンダリングされません。Product モデルの列のみが XML ファイルに表示されます。format.xml 行を次のように変更してみました

format.xml  { render :xml => @products.to_xml( :include => :providers) }

しかし、これは私が望むものではありません。5列のSQLクエリを見ることができるように

SELECT providers.id, providers.title, products.id, products.title, products.price 
FROM `products` 
INNER JOIN `products_providers` ON `products_providers`.product_id = `products`.id 
INNER JOIN `providers` ON `providers`.id = `products_providers`.provider_id 
LIMIT 10

しかし、私の XML では 3 つしか表示されません。メソッド to_xml もいくつかのエクストラン SQL リクエストを生成しますが、それは望ましくありません。

RailsにすべてのSQLフィールドをレンダリングするように指示する方法について、誰かが私に情報を提供できますか? コードも最適化してほしい。

理想的な XML/JSON 設計は次のようになります。

<products type="array">
<product>
  <id type="integer">1</id>
  <price type="decimal">9.99</price>
  <title type="string">Sanke Rolex</title>
  <provider>
    <id type="string">1</id>
    <title type="string"></title>
  </provider>
</product>
</products>

THX!

4

2 に答える 2

4

:selectXML出力にすべての属性を含めるように明確に言ったときに、パラメーターの特定の列に制限している理由がわかりません。

最も最適化されたコードは次のとおりです。

@products = Product.all(:include => :providers, :limit => 10)
respond_to do |format|
  format.xml  { render :xml => @products.to_xml(:include => :providers) }
  format.json { render :json => @products.to_json(:include => :providers) }
end

私はファインダー:includeの代わりに使用:joinsしています。つまり、ARは2つのSQLクエリを使用して最初の製品をフェッチし、次にプロバイダーをフェッチします。これは、結合よりも大きなテーブルの方が高速です。

一部のプライベート列をXML出力に表示しないようにするには、次を使用します。:except

@products.to_xml(
  :except => [:price],
  :include => { :providers => {:except => [:title]} }
)

すべてのモデルには公開されない情報が含まれているため、ほとんどの場合、これが必要です。

于 2009-12-29T11:19:01.133 に答える
1

非常に具体的な出力が必要な場合は、render :xml ショートカットの代わりにBuilder テンプレートを使用します。とても簡単です。

于 2009-12-29T05:10:43.763 に答える