Ruby on rails 如何在Rails中合并具有一对多关系的两个模型?

Ruby on rails 如何在Rails中合并具有一对多关系的两个模型?,ruby-on-rails,ruby,model,rails-activerecord,Ruby On Rails,Ruby,Model,Rails Activerecord,我有两种模式,比如作家和书,一个作家有很多书。我必须通过AJAX获取一份作者名单,以及他们各自的书名 我有一些想法,但不知道哪一个是最好的 独立获取所有作者和书籍,并使用过滤器在JavaScript中对它们进行分组,但这似乎是将服务器应该完成的工作放在JavaScript上。 创建一个ruby类/结构,它将包含一个作者和一系列书籍。查询作者和每个查询对应的书籍,但这似乎是不必要的许多db查询。 与上面相同,但不是包装类,而是获取作者的属性散列并插入书籍的属性散列数组。多个查询的问题与上面相同。

我有两种模式,比如作家和书,一个作家有很多书。我必须通过AJAX获取一份作者名单,以及他们各自的书名

我有一些想法,但不知道哪一个是最好的

独立获取所有作者和书籍,并使用过滤器在JavaScript中对它们进行分组,但这似乎是将服务器应该完成的工作放在JavaScript上。 创建一个ruby类/结构,它将包含一个作者和一系列书籍。查询作者和每个查询对应的书籍,但这似乎是不必要的许多db查询。 与上面相同,但不是包装类,而是获取作者的属性散列并插入书籍的属性散列数组。多个查询的问题与上面相同。 最好在一个查询中以某种方式连接表,以检索所有已与其书籍合并的作者。类似于sql join的东西,但如果一对多关系存在的话。
主动模型序列化程序是一个快速而简单的解决方案。它将数据序列化为json,并提供对要显示哪些属性的完全控制

在您的文件中:

gem 'active_model_serializers'
然后运行以下命令:

bundle install
rails g serializer Author
rails g serializer Book
现在将生成2个新文件

author_serializer.rb book_serializer.rb 作者(u controller.rb)
请注意,索引指定了每个序列化程序,而show指定了序列化程序。

主动模型序列化程序是一种快速简便的解决方案。它将数据序列化为json,并提供对要显示哪些属性的完全控制

在您的文件中:

gem 'active_model_serializers'
然后运行以下命令:

bundle install
rails g serializer Author
rails g serializer Book
现在将生成2个新文件

author_serializer.rb book_serializer.rb 作者(u controller.rb) 请注意,索引指定每个序列化程序,show指定序列化程序。

您可以这样做

Author.includes(:books)
这将生成两个查询,一个用于作者,一个用于书籍,您将获得一个“author”对象集合,每个对象都有一个“books”集合。

您可以这样做

Author.includes(:books)
这将生成两个查询,一个用于作者,一个用于书籍,您将获得一个“author”对象的集合,每个对象都有一个“books”集合。

要将作者和书籍序列化为JSON,您可以向JSON提供include参数:

提供完整的文档。如果需要呈现JSON以进行关联,那么active_model_serializer也可以工作,并且可以更好地扩展,但如果只有一种情况,则可能会有过大的杀伤力。

要将作者和书籍序列化为JSON,您可以向_JSON提供include参数:


提供完整的文档。如果您需要为关联呈现JSON,那么active\u model\u serializer也可以工作,并且可以更好地扩展,但是如果您只有一个案例,那么可能会有点过头。

您已经研究过active\u model\u serializer了吗?没有,我没有。我花了很多时间研究这个问题,这是我第一次听到这个名字。我现在会调查的,谢谢。你们已经调查过active\u model\u序列化程序了吗?不,我没有。我花了很多时间研究这个问题,这是我第一次听到这个名字。我现在会调查的,谢谢。
class SomeJsonController < ApplicationController
  def show
    author = Author.find(params[:id])
    respond_to do |format|
      format.json { render json: author.to_json(include: :books) }
    end
  end
end