Ruby on rails railsapi:as_json with includes查询数据库,尽管前面有includes

Ruby on rails railsapi:as_json with includes查询数据库,尽管前面有includes,ruby-on-rails,ruby,activerecord,Ruby On Rails,Ruby,Activerecord,我正在努力寻找最好的方式来呈现记录。到目前为止,我是按照以下方式完成的,但是,尽管在获取主对象时有include,但在为包含的子记录调用as_json时,我会得到大量的DB查询。我错过了什么?还有更好的方法来做我想做的事吗 我不知道如何进行更好的渲染,因为我想确定在关联记录数组上序列化和使用自定义作用域的属性和方法 我的控制器 def显示 #下面的include似乎没有用,在渲染时再次查询数据库。 @祖父母=祖父母。包括(父母:{子女:%i[grand_children friends]})

我正在努力寻找最好的方式来呈现记录。到目前为止,我是按照以下方式完成的,但是,尽管在获取主对象时有include,但在为包含的子记录调用
as_json
时,我会得到大量的DB查询。我错过了什么?还有更好的方法来做我想做的事吗

我不知道如何进行更好的渲染,因为我想确定在关联记录数组上序列化和使用自定义作用域的属性和方法

  • 我的控制器
def显示
#下面的include似乎没有用,在渲染时再次查询数据库。
@祖父母=祖父母。包括(父母:{子女:%i[grand_children friends]})
.按名称查找(参数[:名称])
返回头:未找到,除非@祖父母
呈现json:grand_parent_为_json,状态::ok
结束
私有的
def grand_parent_作为_json
json=@grandParent.as_json(
仅:%i[attr1 attr2],
方法:%i[meth1-meth2]
)
#因为我想在父对象上使用自定义作用域,所以我看不到更好的渲染方法
json[:parents]=@grandParent.parents.ordered_by_birthdate(:desc).map do|parent|
父对象作为父对象
结束
json
结束
#下面的include似乎负责再次查询数据库。
def parent_as_json(parent)
parent.as_json(
仅:%i[attr1 attr2],
方法:%i[meth1 meth2],
包括:[
儿童:{
仅:%i[attr1 attr2],
包括:[
grand_子项:{%i[attr1 attr2]}
]
}
]
)
结束

可以肯定有一种更优雅的方法来解决这个问题,但问题确实在于这里使用的范围:

@grandParent.parents.ordered_by_birthdate(:desc)
原因是作用域保证返回一个新的ActiveRecord::Relation,当访问该关系时,它会命中数据库

这可能不是最好的答案,但它可以通过更改初始查询来工作,在
出生日期
字段中包含
.order

@grandParent = GrandParent
  .includes(parents: { children: %I[grand_children friends] })
  .order("parents.birthdate DESC")
  .find_by_name(params[:name])
然后在映射父对象时删除
.ordered_by_birthdate
,因为它们已经按照您想要的顺序进行了映射。这样做的缺点是不使用在父项上定义的按出生日期排序的范围。这可能是正常的,这取决于您如何查看控制器和模型的责任

或者,上述代码片段也可以是
祖父母
上作用域的一部分,例如

class GrandParent
  scope :family_tree, -> { includes(parents: { children: %I[grand_children friends] }).order("parents.birthdate DESC") }
end
然后你可以做:

GrandParent.family_tree.find_by_name(params[:name])

我没有考虑范围做的包括,我要看看这个,谢谢。事实上,排序范围是在另一个关联表的属性上排序。是的,在我的示例中,它根据关联的父母的出生日期排序。这就是你想要发生的吗?我举这个例子是为了让你更容易理解。正如我所说,它与另一个表相关联。就本例而言,假设生日在与父项关联的
生日\u事件
表中。应按以下方式订购:
parents.birth\u events.date DESC