我正在 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
返回了重复的数据。
我认为问题在于
includes
并不总是生成连接,有时它会对包含的数据执行额外的查询。我相信它通常能够检测到在 where 中引用表的使用,但由于您对 ILIKE 的字符串查询,它不会检测到它。
我认为您只需在查询中添加
joins(:packages)
(使用 includes
)即可解决问题。
或者您可以只选择显式的
joins
,但添加 distinct
以消除重复项,这是一种非常常见的模式。