2011-08-02 13 views
7

Raylar denetleyicisinin yanıtındaki belirli alanları kısıtla

def index 
    @videos = Video.all.to_a 

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

gibi bir kontrol cihazım var. Video name ve title özniteliklerine sahiptir.

İade xml'in sadece title içerdiğini istiyorum.

Yanıtı nasıl engellerim?

cevap

11

Eklemek istediğiniz alanları belirterek select yan tümcesi, Video.all sorgunuzu kullanabilirsiniz.

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

Ayrıca size sorguya to_a aramaya gerek olmamalıdır.

+2

yanı oldukça iyidir, ben inanmıyorum İhtiyacınız: Bu sorgu tüm – Jon

24

bunu böyle yapmak:

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 

Sen the serialization documentation Bu konuda daha fazla bilgi bulabilirsiniz.

class Video < ActiveRecord::Base 

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

end 

Sonra size denetleyicisi respond_with(@videos) çağırır:

2

Sen video.rb

örneğin kendi .to_xml yöntemini tanımlayabilirsiniz.

Bkz. Bu similar question. , O zaman bu

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

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

çok hızlı olacaktır: Sadece başlıkları bir dizi (id hiçbir tahmin ediyorum): dönen eğer, koparmak:

-1

hızlı bir yoludur kullanmak olacaktır koparmak, diğer seçeneklerden daha hızlı olacaktır çünkü istenen veriyle bir dizi döndürür. Her bir veritabanı satırı için bir ActiveRecord nesnesini başlatmaz. Çünkü onun yakutu, bu örneklemeler çoğu zaman alanlardır. Ayrıca yapabilirsiniz: Eğer SQL kalem çıkmak istemiyorsanız

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

, bu

İlgili konular