2009-12-29 31 views
2

我使用2连接模型Rails的渲染内蒙古XML JOIN

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不会被渲染。 XML文件中只显示产品模型的列。我尝试更改format.xml行到

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

但这不是我想要的。你可以瑟我的SQL查询5列

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

我不明白为什么当你明确表示希望XML输出包含所有属性时,为什么只限制:select参数中的某些列。

最优化的代码会是这样:

@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]} } 
) 

你几乎总是需要这样,因为每个模型包含不被公开曝光信息。

1

在需要特定输出的情况下,我使用Builder template而不是render:xml快捷方式。这很简单。

+0

JSON格式呢?我想创建一个通用的@variable,可以转换为任何格式 - XML,JSON – xpepermint 2009-12-29 09:19:50

+0

如何从两个表格访问信息。我看到的唯一方法是使用AS - SELECT products.id AS product_id ... – xpepermint 2009-12-29 11:01:12