首页 > 解决方案 > 返回关联的计数而不是所有关联本身

问题描述

所以,一个Object有很多properties,一个property属于一个Object。这就是目前的协会。现在,当我使用 Object.all 渲染所有对象并包含关联时,我会在渲染的 JSON:properties中获得模型的所有属性。property但我真的不需要那个。我需要的只是关联的数量。即,只是与任何一个对象相关联的属性的数量。这是我的代码:

@objects = Object.all
respond_to do |format|
  format.json { 
    render json: @objects.to_json(:include => [:properties]) 
  }
end

这会产生类似的东西。目前只有 1property与1 相关联object,并且正如您在 JSON 中看到的那样,我得到了很多关于properties我不需要也不想要的相关的(或者更确切地说,属性)的信息。

"id": 2,
"attrs_go_here": "asdfsdaf"
"created_at": "2018-07-14T23:51:55.161Z",
"updated_at": "2018-07-14T23:51:55.161Z",
"properties": [
    {
        "id": 5,
        "more_attributes": "asdfasdfasdf"
        "created_at": "2018-07-14T23:53:14.917Z",
        "updated_at": "2018-07-14T23:53:14.917Z"
     }
]

但相反,我想要这样的东西,我得到关联的数量:

"id": 2,
"attrs_go_here": "asdfsdaf"
"created_at": "2018-07-14T23:51:55.161Z",
"updated_at": "2018-07-14T23:51:55.161Z",
"properties": 1

我只想要这个数字的原因是因为可能有数十万个属性与任何一个对象相关联。而且我觉得渲染与对象关联的所有属性的所有属性真的很慢,而我首先需要的是对象与其属性之间存在的关联数量。

标签: ruby-on-railsjsonapi

解决方案


为您的模型添加方法Object

def properties_count
  self.properties.count
end

在你的控制器上做

render json: @objects.to_json(methods: [:properties_count]) 

虽然我不确定可能的 n+1。在这种情况下,您应该使用

@objects = Object.includes(:properties).all

编辑从技术上讲,它不打算给出论据to_json只需要吸气剂。但是你可以按照这些思路做一些事情:

class Object
  attr_accessor :attribute

  def method_with_params(attribute = nil)
    attribute ||= attribute
    # rest of your code
  end
end


@object.attribute = 'foodbar'
render json: @object.to_json(methods: [:method_with_params]

)


推荐阅读