2017-07-07 114 views
0

一个连接表的字段我有三个表:过滤器使用JSONAPI资源

  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 “观察”, “ID”, “观察”, “ID” AS ALIAS_0 FROM“observations”LEFT OUTER JOIN “observation_translations”ON “observation_translations”。“observation_id”=“views”。“id” WHERE(subcategories.category_id ='1')ORDER BY“observations”。“id” ASC限额$ 1 OFFSET $ 2 [[“LIMIT”,1000],[“OFFSET”,0]]

因为没有桌子上subcategories

参加如果我添加一个默认范围包括subcategories所有查询的工​​作很好,但最后一个出现故障,试图对记录进行计数时:

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

我该如何正确地做到这一点?

回答

0

OK,则解决方案是使用一个'joins`:

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