【问题标题】:Spree Ruby on rails querySpree Ruby on rails 查询
【发布时间】:2017-08-18 11:15:14
【问题描述】:

尝试学习 Ruby 和 Spree

我的控制器中有一个运行良好的查询:

@products = Spree::LineItem.select("spree_line_items.id, 
spree_variants.sku, spree_products.name, spree_line_items.quantity")
.joins(:order).joins(:variant).joins(:product)
.where(spree_orders: {state: 'complete', shipment_state: 'ready'})

当我在视图中运行查询时

<% @products.each do |lineItem| %>
<%= lineItem.id %><br>
<% end %>

这可以正常工作并吐出所有 ID,但我想输出其他位、Sku、Name 和 Quantity,它们都来自其他表。我怎么把他们带到这里来?

如果我引用它们与 ID 相同,我会得到一个委托错误。

【问题讨论】:

  • 什么是@ordersNew?您还没有向我们展示这是如何定义的,所以我不知道为什么会发生错误。附带说明一下,使用 snake_case 而不是 camelCase 作为变量名是 ruby convention
  • 那只是一个错字,应该是产品。现已更新
  • 您的select 查询是否有充分的理由?为什么不直接返回整个记录?然后你可以做例如product.variant.sku .... 此外,您看到的错误究竟是什么

标签: ruby activerecord spree ransack


【解决方案1】:

要回答您的问题,您可以这样做

@products = Spree::LineItem.select("spree_line_items.id, 
spree_variants.sku AS variant_sku,
spree_products.name as product_name,
spree_line_items.quantity as quantity")
.joins(:order).joins(:variant).joins(:product)
.where(spree_orders: {state: 'complete', shipment_state: 'ready'})

然后访问sku为lineItem.variant_sku,名称为lineItem.product_name,数量为lineItem.quantity

但实现这一点的适当方法是

Spree::LineItem.joins(:order).includes(variant: :product)
.where(spree_orders: {state: 'complete', shipment_state: 'ready'})

访问属性为lineItem.skulineItem.namelineItem.quantity

我们可以这样做是因为skunameline_item 模型中被委托给variant。这与您收到DelegationError 的原因相同。

【讨论】: