2011-08-02 11 views
7

Mam działania kontrolera jakOgraniczanie konkretnych pól w odpowiedzi szyn kontrolera

def index 
    @videos = Video.all.to_a 

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

Wideo ma atrybuty name i title.

Chcę, aby powrócić xml zawiera tylko title.

Jak ograniczyć to działanie w odpowiedzi.

Odpowiedz

11

Możesz użyć klauzuli select dla zapytania Video.all, określając pola, które chcesz uwzględnić.

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

Nie należy również dzwonić pod numer to_a w zapytaniu.

+2

Jak dobrze, ja nie wierzę, że potrzebne: wszystko na tego zapytania – Jon

24

Robi to tak:

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 

można znaleźć więcej informacji na ten temat w the serialization documentation.

2

Można zdefiniować swoją własną metodę .to_xml wewnątrz video.rb,

np:

class Video < ActiveRecord::Base 

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

end 

a następnie zadzwonić respond_with(@videos) w was kontrolera.

Zobacz tę similar question.

-1

szybki sposób byłoby użyć : zrywać, jeśli jesteś po prostu powrocie tablicę tytułów (jestem zgadywania nie id), wówczas byłoby to bardzo szybko

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

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

: oskubać będzie o wiele szybszy niż jakakolwiek inna opcja, ponieważ zwraca tablicę zawierającą tylko żądane dane. Nie tworzy instancji całego obiektu ActiveRecord dla każdego wiersza bazy danych. Ponieważ jego rubin, te sytuacje są tym, co zajmuje większość czasu. Można również zrobić:

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

jeśli nie chcesz, aby uzyskać SQL ołówek na zewnątrz, to jest całkiem dobry

Powiązane problemy