【问题标题】:Filter by a field of a join table using JSONAPI Resources使用 JSONAPI 资源按连接表的字段过滤
【发布时间】:2017-07-07 15:53:59
【问题描述】:

我有三张桌子:

  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" 左外连接 “观察翻译”开启 "observation_translations"."observation_id" = "观察"."id" WHERE (subcategories.category_id = '1') ORDER BY "observations"."id" ASC LIMIT $1 OFFSET $2 [["LIMIT", 1000], ["OFFSET", 0]]

因为subcategories表上没有join

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

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

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

【问题讨论】:

    标签: ruby-on-rails activerecord jsonapi-resources


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2020-10-23
      • 2016-09-04
      • 2017-02-13
      • 1970-01-01
      • 1970-01-01
      • 2019-05-12
      • 1970-01-01
      • 1970-01-01
      • 2016-10-11
      相关资源
      最近更新 更多