gpt4 book ai didi

ruby-on-rails - Rails 渲染 INNER JOIN 的 XML

转载 作者:数据小太阳 更新时间:2023-10-29 02:59:39 25 4
gpt4 key购买 nike

我正在使用 2 个连接的模型

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

我的 Controller 看起来像这样

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 文件中仅显示 Product 模型的列。我尝试将 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>

谢谢!

最佳答案

我不明白为什么要将自己限制在 :select 参数中的某些列,而您明确表示希望 XML 输出包含所有属性。

最优化的代码是这样的:

@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

我在 finder 中使用 :include 而不是 :joins,这意味着 AR 将使用 2 个 SQL 查询来获取第一个产品然后是提供者,这在更大的情况下更快表而不是连接。

要在 XML 输出中排除某些私有(private)列,请使用 :except

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

您几乎总是希望这样做,因为每个模型都包含不公开的信息。

关于ruby-on-rails - Rails 渲染 INNER JOIN 的 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1972640/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com