2017-07-07 103 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]) 
}