在主模型的表单中创建多个子模型

时间:2019-10-24 20:59:40

标签: ruby-on-rails simple-form

这里是情况:

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:请注意,我在表单中使用简单表单的宝石

1 个答案:

答案 0 :(得分:0)

对于所有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

控制器:

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])

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