2011-08-02 54 views
7

的響應特定的字段我有一個像限制在軌道控制器

def index 
    @videos = Video.all.to_a 

    respond_to do |format| 
    format.xml { render :xml => @videos } 
    format.json { render :json => @videos } 
    end 
end 

視頻控制器操作有屬性nametitle

我想返回XML只包含title

如何從響應中限制它。

回答

11

您可以在Video.all查詢中使用select子句,指定要包含的字段。

@videos = Video.select("id, name, title").all 

此外,您不應該在您的查詢中致電to_a

+2

同時,我不相信你所需要的:所有在此查詢 – Jon

24

做這樣的:

def index 
    @videos = Video.all 

    respond_to do |format| 
    format.xml { render :xml => @videos.to_xml(:only => [:title]) } 
    format.json { render :json => @videos.to_json(:only => [:title]) } 
    end 
end 

您可以在the serialization documentation找到更多這方面的信息。

2

您可以定義自己的.to_xml方法內部video.rb

e.g:

class Video < ActiveRecord::Base 

    def to_xml(opts={}) 
    opts.merge!(:only => [:id, :title]) 
    super(opts) 
    end 

end 

然後調用respond_with(@videos)在你的控制器。

看到這個similar question

-1

一個快速的方法是使用:採摘,如果你只是返回標題的陣列(我猜沒有:ID),那麼這將是非常快的

def index 
    @titles = Video.pluck(:title) 

    respond_to do |format| 
    format.xml { render :xml => @titles } 
    format.json { render :json => @titles } 
    end 
end 

:動物內臟將比任何其他選項快得多,因爲它僅返回一個僅包含請求數據的數組。它沒有爲每個數據庫行實例化整個ActiveRecord對象。因爲它的紅寶石,那些實例是大部分時間需要的。你也可以這樣做:

@videos_ary = Video.pluck(:id, :title) 
response = @videos_ary.map {|va| { id: va[0], title: va[1] }} 

,如果你不想讓你的SQL鉛筆出來,這是相當不錯的