عودة عدد الجمعيات بدلا من جميع الجمعيات نفسها

2

لذا ، Object لديه الكثير properties و property ينتمي إلى Object . هذه حاليا الجمعية. الآن عندما أقوم بتقديم كافة الكائنات باستخدام Object.all وتضمين :properties جمعيات ، أحصل على جميع الصفات property نموذج في JSON المقدمة. لكنني في الحقيقة لست بحاجة لذلك. كل ما أحتاجه هو عدد الجمعيات الموجودة. أي ، يرتبط عدد الخصائص فقط بأي كائن واحد. ها هو الكود الخاص بي:

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

هذا ينتج شيء مثل هذا. يوجد حاليا 1 فقط property المرتبطة 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

إن السبب وراء رغبتي في الرقم فقط هو أنه من المحتمل أن يكون هناك مئات الآلاف من الخصائص المرتبطة بأي كائن واحد. وأشعر أنه سيكون بطيئًا حقًا في تقديم جميع سمات جميع الخصائص المرتبطة بكائن عندما يكون كل ما أحتاجه هو عدد الارتباطات بين الكائن وخصائصه في المقام الأول.

2 الاجابة

0

أضف طريقة إلى نموذج لك 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]

)

:مؤلف
0

ستحل هذه الإجابة محل "خصائص" بـ "خصائص_البقية" لتبسيطها

Object.select('objects.*', 'COUNT(properties.id) as properties_count')
      .joins(:properties)
      .group('objects.id')
:مؤلف
فوق
قائمة طعام