我正在做RubyonRails API。我有两个模型plans
和categories
,它们有"多对多"的关系,所以我使用一个名为category_plans
的模型的中间表。我想要的是创建一个包含多个类别的计划,每个类别都有两个以上的属性(kind
、portion
(,这些属性将保存在中间表上。(我使用的是Postgresql(。
类别
class Category < ApplicationRecord
has_many :category_plans
has_many :plan, through: :category_plans
end
计划
class Plan < ApplicationRecord
has_many :category_plans
has_many :category, through: :category_plans
end
类别计划
class CategoryPlan < ApplicationRecord
validates_presence_of :category, :plan
enum kind: {
Colacion: 'Colacion',
Desayuno: 'Desayuno',
Comida: 'Comida',
Cena: 'Cena'
}, _prefix: :kind
belongs_to :category
belongs_to :plan
end
以下是我使用的迁移:
计划
class CreatePlans < ActiveRecord::Migration[5.2]
def change
create_table :plans do |t|
t.string :name
t.references :patient, foreign_key: true
t.text :description
t.datetime :deleted_at
t.timestamps
end
end
end
类别
class CreateCategories < ActiveRecord::Migration[5.2]
def change
create_table :categories do |t|
t.string :name
t.timestamps
end
end
end
类别计划
class CreateCategoryPlans < ActiveRecord::Migration[5.2]
def up
execute <<-SQL
CREATE TYPE type_food AS ENUM ('Colacion', 'Desayuno', 'Comida',
'Cena');
SQL
create_table :category_plans do |t|
t.belongs_to :category, :null => false, :index => true
t.belongs_to :plan, :null => false, :index => true
t.column :kind , :type_food
t.float :portion
end
add_index :category_plans, :kind
end
def down
drop_column :kind, :type_food
execute "DROP kind type_food;"
end
end
控制器:
class V1::PlansController < ApplicationController
before_action :set_patient, only: [:show, :update, :destroy]
def create
plan = Plan.new(plan_params)
if plan.save
render json: {status: 'Success', message: 'Saved plan', data:
plan}, status: 201
else
render json: {status: 'Error', message: 'Plan not saved', data:
plan.errors}, status: :unprocessable_entity
end
end
def plan_params
params.require(:plan).permit(:name, :patient_id, :description,
category_plans_attributes: [:id, :kind, :portion,
category_attributes: [:id]])
end
end
我不确定"强params"是否正确,也不确定如何处理JSON结构,此时我得到了这样的结果:
JSON
{
"plan": {
"name": "Plan 8",
"patient_id": "3",
"description": "Plan nuevo",
"category_plan": {
"kind": "Cena",
"portion": "12.3"
}
}
}
您提交的JSON需要与plan_params
中允许的属性相同
{
"plan": {
"name": "Plan 8",
"patient_id": "3",
"description": "Plan nuevo",
"category_plans_attributes": [{
"kind": "Cena",
"portion": "12.3"
}]
}
}
此外,您还需要将accepts_nested_attributes_for : category_plans
添加到Plan
模型中。
如果之后没有成功,请尝试并检查rails应用程序日志中的错误。