无法在连接表中进行过滤

问题描述 投票:0回答:1

我正在 ruby on Rails 创建一个 API,我有 3 个表

Invoice
Package
Additional_charge

Invoice
有很多
Packages
并且
Packages
有很多
Additional_charges

我有这样的疑问:

invoices = Invoice.includes(packages: :additional_charges)
                      .where(user_id: @current_user.id)
                      .order(created_at: :desc)

@invoices = invoices.paginate(page:, per_page:)

我正在使用

jbuilder
返回数据。 这是我的
jbuilder
文件。

json.invoices @invoices do |invoice|
  json.(invoice, :id, :number, :total, :status, :created_at)
  json.packages invoice.packages do |package|
    json.(package, :tracking, :calculated_weight, :price)
    json.type package.shipping_method
    json.additional_charges package.additional_charges do |additional_charge|
      json.(additional_charge, :name, :amount)
    end
  end
end

但问题是当我尝试过滤名为

Packages
Tracking
列时。

我尝试像这样修改代码:

invoices = Invoice.includes(packages: :additional_charges)
                      .where(user_id: @current_user.id)

invoices = invoices.where('packages.tracking ILIKE ?', "%#{tracking}%") if tracking.present?

@invoices = invoices.order(created_at: :desc).paginate(page:, per_page:)

我收到了这个错误:

ActiveRecord::StatementInvalid (PG::UndefinedTable: 错误: 缺少表“packages”的 FROM 子句条目 第 1 行:...M“发票”,其中“发票”。“user_id”= $1 AND (packages.t...

有没有办法让我可以按

trackin
表中的
Packages
列进行过滤?

我也尝试使用连接,但是

jbuilder
返回了重复的数据。

ruby-on-rails ruby jbuilder
1个回答
0
投票

我认为问题在于

includes
并不总是生成连接,有时它会对包含的数据执行额外的查询。我相信它通常能够检测到在 where 中引用表的使用,但由于您对 ILIKE 的字符串查询,它不会检测到它。

我认为您只需在查询中添加

joins(:packages)
(使用
includes
)即可解决问题。

或者您可以只选择显式的

joins
,但添加
distinct
以消除重复项,这是一种非常常见的模式。

© www.soinside.com 2019 - 2024. All rights reserved.