我有像
这样的控制器动作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
属性。
我希望return xml仅包含title
。
如何从响应中限制它。
答案 0 :(得分:29)
这样做:
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找到更多相关信息。
答案 1 :(得分:11)
您可以在select
查询中使用Video.all
子句,指定要包含的字段。
@videos = Video.select("id, name, title").all
此外,您不需要在查询中致电to_a
。
答案 2 :(得分: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。
答案 3 :(得分:-3)
快速的方法是使用: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铅笔拿出来,那就非常好了