0

我有三张桌子:

  1. 观察
  2. 子类别
  3. 类别

具有以下结构:

class Observation < ApplicationRecord
  translates :name
  belongs_to :subcategory
end

class Subcategory < ApplicationRecord
  belongs_to :category
  has_many :observations
end

class Category < ApplicationRecord
  has_many :subcategories
end

我希望能够JSONAPI::Resource根据观察结果进行过滤category_id

class ObservationResource < JSONAPI::Resource
  attributes :name, :subcategory_id
  filter :subcategory_id, :test

  filter :test, apply: ->(records, value, _options) {
    records.where('subcategories.category_id = ?', value[0])
  }
end

如果我尝试执行请求:

/observations?include=subcategory,subcategory.category&filter[subcategory.category_id]=1

我得到:

不允许 subcategory.category_id

如果我尝试执行请求:

/observations?include=subcategory,subcategory.category&filter[test]=1

尝试执行时,我收到来自 Postgres 的异常:

SQL (6.4ms) SELECT DISTINCT "observations"."id", "observations"."id" AS alias_0 FROM "observations" LEFT OUTER JOIN "observation_translations" ON "observation_translations"."observation_id" = "observations"."id" WHERE (subcategories.category_id = '1') ORDER BY "observations"."id" ASC LIMIT $1 OFFSET $2 [["LIMIT", 1000], ["OFFSET", 0]]

因为桌子上没有连接subcategories

如果我添加一个默认范围以包含subcategories所有查询,但最后一个查询失败,则在尝试计算记录时:

SELECT COUNT(*) FROM "observations" WHERE (subcategories.category_id = '1')

我怎样才能正确地做到这一点?

4

1 回答 1

0

好的,解决方案是使用“joins”:

filter :test, apply: ->(records, value, _options) {
  records.joins(:subcategory).where('subcategories.category_id = ?', value[0])
}
于 2017-07-10T16:41:44.907 回答