Rails以简单的方式创建具有某些属性的哈希并且还嵌套

时间:2012-02-25 21:58:39

标签: ruby-on-rails ruby ruby-on-rails-3

在我的控制器中我有:

  def search
  @sog = Konkurrencer.where("titel like ?", "%#{params[:q]}%")
  @kate = []
  @sog.each do |kat|
    h = {}
    kat.attributes.each{|k,v| h[k] = v.respond_to?(:force_encoding) ? v.dup.force_encoding("UTF-8") : v }
    @kate << h
  end
  respond_to do |format|
  format.html
  format.json { render :json => @kate }
  end

问题是JSON包含模型的所有属性。如何创建仅具有ID,URL和标题的JSON?

JSON还应包含密钥“url”,该密钥应该是关联照片的URL。我用回形针。路径为:@konkurrencer.photo.image.url

更新 我的search.json.erb:

[
<% @sog.each do |kon| %>
{"id":"<%= kon.id %>","titel":"<%= kon.titel %>"},
<% end %>
]

如何移除最后一个循环?

2 个答案:

答案 0 :(得分:1)

答案 1 :(得分:1)

使用要显示的属性列表创建一个数组。使用select查询方法仅在SQL请求中获取此字段。最后循环使用此属性来填充JSON数组:

def search
  displayed_attributes = %w{id url titel}

  @sog = Konkurrencer.select(displayed_attributes.join(',')).where("titel like ?", "%#{params[:q]}%")
  @kate = []
  @sog.each do |kat|
    h = {}
    displayed_attributes.each do |attribute| 
       v = kat[attribute]
       h[attribute] = v.respond_to?(:force_encoding) ? v.dup.force_encoding("UTF-8") : v
    end
    @kate << h
  end
  respond_to do |format|
    format.html
    format.json { render :json => @kate }
  end
end