2010-10-22 24 views
2

首先,我沒有使用Rails。我使用Active Record將Sinatra用於此項目。在模型陣列上的有效記錄to_json as_json

我希望能夠覆蓋我的Model類中的to_json或as_json,並讓它定義一些「默認」選項。例如,我有以下幾種:

class Vendor < ActiveRecord::Base 
    def to_json(options = {}) 
    if options.empty? 
     super :only => [:id, :name] 
    else 
     super options 
    end 
    end 
end 

其中供應商擁有的不僅僅是id和name。在我的路線我有類似如下:

@vendors = Vendor.where({}) 
@vendors.to_json 

這裏@vendors是陣列供應商對象(明顯)。然而,返回的json並沒有調用我的to_json方法,而是返回了所有的模型屬性。

我真的沒有修改路由的選項,因爲我實際上使用了修改後的sinatra-rest gem(http://github.com/mikeycgto/sinatra-rest)。

關於如何實現此功能的任何想法?我可以做這樣的事情在我屈休息寶石以下但這似乎愚蠢:

@PLURAL.collect! { |obj| obj.to_json } 

回答

5

嘗試這一翻譯覆蓋serializable_hash:

def serializable_hash(options = nil) 
    { :id => id, :name => name } 
end 

更多信息here

+0

正是我所需要的。我喜歡這樣一個事實,即我也可以添加不屬於屬性的屬性。萬分感謝! – mikeycgto 2010-10-22 19:53:48

3

如果覆蓋as_json代替to_json的,陣列中的每個元素將與as_json格式化前的數組轉換爲JSON

我用下面僅露出才能訪問屬性:

def as_json(options = {}) 
    options[:only] ||= self.class.accessible_attributes.to_a 
    super(options) 
end