Ограничить конкретные поля в ответе контроллера рельсов - PullRequest
10 голосов
/ 03 августа 2011

У меня есть действие контроллера, как

def index
  @videos =  Video.all.to_a

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

Видео имеет атрибуты name и title.

Я хочу, чтобы возвращаемый xml содержал только title.

Как мне ограничить это от ответа.

Ответы [ 4 ]

29 голосов
/ 03 августа 2011

Делая это следующим образом:

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

Подробнее об этом можно узнать на документации по сериализации .

11 голосов
/ 03 августа 2011

Вы можете использовать предложение select в запросе Video.all, указав поля, которые вы хотите включить.

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

Кроме того, вам не нужно вызывать to_a в своем запросе.

2 голосов
/ 03 августа 2011

Вы можете определить свой собственный метод .to_xml внутри video.rb,

например:

class Video < ActiveRecord::Base

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

end

А затем позвоните respond_with(@videos) в свой контроллер.

См. аналогичный вопрос .

0 голосов
/ 16 февраля 2016

быстрый способ будет использовать : pluck , если вы просто возвращаете массив заголовков (я предполагаю, нет: id), то это будет очень быстро

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

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

: pluck будет работать намного быстрее, чем любой другой параметр, потому что он возвращает массив только с запрошенными данными. Он не создает экземпляр всего объекта ActiveRecord для каждой строки базы данных. Потому что это рубин, эти экземпляры занимают большую часть времени. Вы также можете сделать:

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

если вы не хотите использовать карандаш SQL, это очень хорошо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...