如何将 Rails 父/子发送到前端 JS,以便可以作为嵌套对象进行访问

问题描述 投票:0回答:2

在后端,我的对象关系是

Item
has_many
Options
。我希望能够在前端以哈希形式访问该项目及其子选项的所有属性:

items = [
  {
    id: 1,
    item_attribute_name: item_attribute_value,
    options: [
      {id: 1, option_attribute_name: option_attribute_value},
      {id: 2, option_attribute_name: option_attribute_value},
    ]
  },
  { 
    id: 2,
    item_attribute_name: item_attribute_value,
    options: []
  }
]

我通过 json 对象发送数据以响应 ajax 请求,或者使用方便的

gon
gem。我注意到,如果我只是对发送父项感兴趣,那么格式化会自动发生,这样我就可以发回
Item.all
,并在前端获取一个项目数组,其中每个项目都是一个哈希值,准确地表示其属性如我所愿。

但是如果我想送孩子们去,有标准的方法吗?我意识到我可以自己构建子属性,如下所示,但想知道是否有更直接的方法。

我如何通过构造子属性来完成这项工作:

items = Item.all
items.each do |i|
  child_attr = {"options" => i.options }
  i.attributes.merge(child_attr)
end
顺便说一句,一个完全可以接受的答案是,如果不做我现在正在做的事情,就没有……自动的方法来做到这一点,即将每个父对象转换为后端的属性,然后将子属性缝合在一起。

坦率地说,我只是问这个问题,因为如果可能的话,最好将对象关系保留在后端以便在其他地方重用,而不是把东西变成散列。

javascript ruby-on-rails ruby
2个回答
0
投票
我认为获得预期结果的唯一方法是进行一些猴子修补。因此,您可以使用序列化程序,或包含或使用默认情况下包含在模型中的 ActiveModel::Serializers::JSON。

例如,使用 ActiveModel::Serializers::JSON,您可以执行以下操作:

items = Item.all items.map! do |i| i.serializable_hash(include: { options: {} }) end
这是由于 Rails 预先加载,这避免了从关联中加载所有子项(例如 has_many)。您想要序列化的位置取决于您的用例。


0
投票

items.includes(:options).as_json(include: [:options])


意思是: 获取项目并预取选项。然后为 items 数组生成 json 并将每个项目的选项包含在 json 中。

© www.soinside.com 2019 - 2024. All rights reserved.