0

我有以下数据模型,并希望呈现一个包含来自每个模型的信息的 json 哈希。例如,client.id、client.name_first、client、name_last、每个客户端的每个锻炼描述以及每个锻炼的每个锻炼描述。

class Client < ActiveRecord::Base
  belongs_to :account
  belongs_to :trainer
  has_many :programs
  has_many :workouts, :through => :programs
end

class Workout < ActiveRecord::Base
  has_many :programs
  has_many :clients, :through => :programs
  has_many :routines
  has_many :exercises, :through => :routines
end

class Exercise < ActiveRecord::Base
  has_many :routines
  has_many :workouts, :through => :routines
end

我的数据库迁移:

class CreateClients < ActiveRecord::Migration
  def change
    create_table :clients do |t|
      t.integer :account_id
      t.integer :trainer_id
      t.string :name_first
      t.string :name_last
      t.string :phone

      t.timestamps
    end
  end
end

class CreateWorkouts < ActiveRecord::Migration
  def change
    create_table :workouts do |t|
      t.string :title
      t.string :description
      t.integer :trainer_id

      t.timestamps
    end
  end
end

class CreateExercises < ActiveRecord::Migration
  def change
    create_table :exercises do |t|
      t.string :title
      t.string :description
      t.string :media

      t.timestamps
    end
  end
end

我能够返回特定客户的锻炼:

@client = Client.find(params[:id])
clients_workouts = @client.workouts.select('workouts.*,programs.client_id').group_by(&:client_id)
render json: clients_workouts

而且我可以返回特定锻炼的练习:

@workout =  Workout.find(params[:id])
exercises_workouts = @workout.exercises.select('exercises.*, routines.workout_id').group_by(&:workout_id)
render json: exercises_workouts

但是,我不知道如何返回包含所有三个表(客户、锻炼、锻炼)信息的数据(通过程序和例程连接)。这可能吗?它是如何完成的?

4

2 回答 2

2

首先,我不确定您的查询中发生了什么:

clients_workouts = @client.workouts.select('workouts.*,programs.client_id').group_by(&:client_id)

这还不够吗?

@client.workouts

现在,回答...假设我仍在关注:

ActiveRecord 提供了一种.to_json方法,这就是这里隐式调用的方法。显式版本将是例如

render json: clients_workouts.to_json

知道了这一点,您可以在 api 中查找to_json(这里有一些很好的文档,即使它显示为已弃用:http ://apidock.com/rails/ActiveRecord/Serialization/to_json )。但是,基本上,答案是从根对象(我相信的客户端)开始,然后在选项哈希中从那里构建包含的对象和属性/方法。

render json: @client.to_json(include: { workouts: { include: :exercises } })

如果需要,您可以自定义每个相关模型中包含哪些属性或方法,只需深入研究文档即可。玩得开心!

于 2013-09-01T05:31:08.850 回答
0

很有可能,他们有不同的方式来选择这一点。

一,没有任何 3rd 方库是使用包含,就像你在解决一个 n+1 问题或者......</p>

使用更酷的方法并使用活动模型序列化器

活动模型序列化器

于 2013-09-01T05:31:24.587 回答