使用include in rails将方法添加到json输出

时间:2016-05-27 23:20:15

标签: ruby-on-rails json

我从我的数据库获取信息

@teams  = Team.select(:id,:name)

然后,我使用assosiation呈现此信息

render json: @teams, include: :players

这产生了以下输入:

[
    {
    "id": 1,
    "name": "Lyon Gaming",
    "players": [
          {
            "name": "Jirall",
            "position": "Superior",
          },
          {
            "name": "Oddie",
            "position": "Jungla",
          }
      ]
}

我怎么需要按特定顺序排序玩家(不按字母顺序排列)

我已经有了sql语句来做这件事;我怎么不知道如何将这种方法应用于每个协会。

我看起来像是:

render json: @teams, (include: :players, method: custom_order)

但这引起了我的错误。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

这应该有效:

render json: @teams, include: :players, methods: :custom_order

我想补充一点,如果你总是希望以这种方式返回对象,你可以将它添加到你的模型中:

  def as_json(options = nil)
    super(include: :players, methods: :custom_order)
  end

正如Adam所提到的,如果你的渲染json开始变得丑陋,那么active_model_serializers是很好的。如果复杂性不会增长太多,我总是建议保持依赖关系。

https://github.com/rails-api/active_model_serializers

答案 1 :(得分:0)

您需要阅读有关rails中序列化程序的更多信息(这是一种很好的做法) 这里有一篇关于这个https://www.sitepoint.com/active-model-serializers-rails-and-json-oh-my/

的好文章

然后你可以做这样的事情

应用程序/串行器/ team_serializer.rb

class TeamSerializer < ActiveModel::Serializer
  attributes :id, :name, :ordered_players
end 

应用程序/控制器/ teams_controller.rb

def index
  respond_with(Team.all.map(&TeamSerializer.method(:new)))
end