以主模型的形式创建多个子模型

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

这里是情况:

class Activity < ApplicationRecord
  has_many :activity_amenities
end
class Amenity < ApplicationRecord
  has_many :activity_amenities
  has_many :activities, through: :activity_amenities
end
class ActivityAmenity < ApplicationRecord
  belongs_to :activity
  belongs_to :amenity
end

所以基本上我有ActivitiesAmenities。我之所以使用has_many :through关联,是因为我想创建基本的Amenities,并且每个Activity的便利设施都有适合该Activity的描述。

所以,我想直接在Activity的创建/版本中创建新的Amenities。此图像应该很好地说明它:

enter image description here

因此,当我单击Add amenity按钮时,它应该添加新的选择/输入组。

然后,当我单击create时,它将创建所有ActivityAmenities并将它们与Activity模型相关联。

任何想法(在Controller和View中)应如何完成?找不到真正的东西...

ps:请注意,我在表单中使用simple-form gem]

这里是情况:类Activity

对于您所有的has_many关联,请包含inverse_of选项。然后,当通过ID添加ActivityAmenities时,将它们作为数组一次全部传递。例如,当您创建activity_params时,请传入activity_amenity_ids []。 Rails将使用自动生成的#activity_amenity_ids =方法为您处理创建。

型号:

class Activity < ApplicationRecord
  has_many :activity_amenities, inverse_of: activity
end
class Amenity < ApplicationRecord
  has_many :activity_amenities, inverse_of: amenity
  has_many :activities, through: :activity_amenities
end
class ActivityAmenity < ApplicationRecord
  belongs_to :activity
  belongs_to :amenity
end

Controller:

params.require(:activity).permit(activity_amenity_ids[], :whatever_else)

视图:无论您输入的表单名称是什么

name="activity[activity_amenity_ids][]"

如果要解释为什么要传入activity_amenity_ids,基本上是tl; dr,它将创建对象(如果不存在则创建对象,如果不存在则不执行任何操作)。

例如尝试

Activity.create(name: "Running or whatever", activity_amenity_ids: [1, 2, 3])

然后查看结果。请注意,如何在单个交易中创建新活动及其相关活动便利?

ruby-on-rails simple-form
1个回答
0
投票

对于您所有的has_many关联,请包含inverse_of选项。然后,当通过ID添加ActivityAmenities时,将它们作为数组一次全部传递。例如,当您创建activity_params时,请传入activity_amenity_ids []。 Rails将使用自动生成的#activity_amenity_ids =方法为您处理创建。

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