2016-12-15 36 views
0

我一直在用Rails構建Web API。對於這種情況, 我需要爲API定義一些資源。 所以很難弄清楚在哪裏放些東西來縮小查詢結果。導軌;在哪裏放置查詢縮小界面

我們可以在AR scope指定東西;

class Post < ActiveRecord::Base 
    scope :published, -> { where(published: true) } 
end 

或 與class method;

class Post < ActiveRecord::Base 
    def self.published 
    where(published: true) 
    end 
end 

serverside resources(I使用jsonapi-resource);

class ContactResource < JSONAPI::Resource 
    attributes :name_first, :name_last, :full_name 
    def full_name 
    "#{@model.name_first}, #{@model.name_last}" 
    end 
    def self.updatable_fields(context) 
    super - [:full_name] 
    end 
    def self.creatable_fields(context) 
    super - [:full_name] 
    end 
end 

什麼讓你決定在哪裏放這些類型的查詢縮小界面。 這些之間有什麼區別。 (特別是class method vs scope很混亂。)

有什麼想法嗎?

+1

如果我正確理解了jsonapi資源,它基本上只是一個將記錄轉換爲JSON的序列化程序。因爲你在上面做的是它屬於模型的數據庫範圍。範圍只是類方法的語法糖。 – max

+1

作用域*是*類方法和[「使用類方法是接受作用域參數的首選方法。」](http://guides.rubyonrails.org/active_record_querying.html#passing-in-arguments)。所以根據官方的Rails指南,你的'published'範圍應該直接作爲類方法實現(即'def self.published')。 –

+0

@max是的,這是串行器。那麼何時將方法放入串行器?我想我可以將方法放入序列化程序或範圍/ AR類方法來輸出縮小結果。 – Tosh

回答

0

我建議你閱讀scope文檔:

不像Shirt.find(...),但是,通過Shirt.red返回的對象是 不是一個數組,但一個ActiveRecord ::關係,這可與其他示波器 合成;它類似於由has_many聲明構造的關聯對象 。例如,你可以調用Shirt.red.first, Shirt.red.count,Shirt.red.where(size:'small')。同樣,與 一樣,關聯對象,名爲範圍的行爲就像一個數組,實現了 Enumerable; Shirt.red.each(& block),Shirt.red.first和 Shirt.red.inject(備忘錄,&塊)都表現得好像Shirt.red確實是 數組。

基本上,使用範圍更靈活。就我個人而言,我將首先使用範圍,如果使用範圍會導致邊界案例問題,則可以使用類方法。