【问题标题】:Rails render as json, include nested attribute and sortRails 呈现为 json,包括嵌套属性和排序
【发布时间】:2011-08-07 11:10:57
【问题描述】:

我正在尝试将对象呈现为 json,包括嵌套属性并按 created_at 属性对其进行排序。

我正在使用代码执行此操作:

format.json  { render :json => @customer, :include => :calls}

如何按 created_at 属性对调用进行排序?

【问题讨论】:

  • 我猜你可以在定义关系的同时定义默认排序。 api.rubyonrails.org/classes/ActiveRecord/Associations/…
  • @tjameson 他们正在调用 render(:json) 方法,我认为在这种情况下将其称为渲染 JSON 是安全的。
  • 很抱歉成为一个语法纳粹,但“渲染”并不专门处理图形。

标签: ruby-on-rails json


【解决方案1】:

如果您认为 Rails 是如何工作的,那么调用只是与调用模型相关的一种方法。有几种方法可以做到这一点。一种是在关联上设置 order 选项。一种是全局更改 Call 模型的默认范围,另一种是在 Customer 模型中创建一个返回调用的新方法(如果您希望在编码之前对调用做任何事情,这很有用。)

方法一:

class Customer < ActiveRecord::Base
  has_many :calls, :order => "created_at DESC"
end

更新

对于 rails 4 及以上使用:

class Customer < ActiveRecord::Base
  has_many :calls, -> { order('created_at DESC') }
end

方法二:

class Call < ActiveRecord::Base
  default_scope order("created_at DESC")
end

方法三:

class Call < ActiveRecord::Base
  scope :recent, order("created_at DESC")
end

class Customer < ActiveRecord::Base
  def recent_calls
    calls.recent
  end
end

那么你可以使用:

format.json  { render :json => @customer, :methods => :recent_calls}

【讨论】:

  • 怎么放多个methods我试过:method =&gt; :abc, :xyz还是不行
  • @iamkdev :method =&gt; [:abc, :xyz]
  • 在 Rails 5.0 中,:order =&gt; 'created_at DESC' 不再工作,应该使用-&gt; { order('created_at DESC') }
  • @Gazer 我有 Rails 4 和 :order =&gt; 'created_at DESC 不起作用,得到了 ArgumentError - Unknown key: :order
  • @tkhuynh 请看你上面的评论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
相关资源
最近更新 更多