对于您所有的has_many关联,请包含inverse_of选项。然后,当通过ID添加ActivityAmenities时,将它们作为数组一次全部传递。例如,当您创建activity_params时,请传入activity_amenity_ids []。 Rails将使用自动生成的#activity_amenity_ids =方法为您处理创建。
这里是情况:
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
所以基本上我有Activities
和Amenities
。我之所以使用has_many :through
关联,是因为我想创建基本的Amenities
,并且每个Activity的便利设施都有适合该Activity的描述。
所以,我想直接在Activity的创建/版本中创建新的Amenities
。此图像应该很好地说明它:
因此,当我单击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])
然后查看结果。请注意,如何在单个交易中创建新活动及其相关活动便利?
对于您所有的has_many关联,请包含inverse_of选项。然后,当通过ID添加ActivityAmenities时,将它们作为数组一次全部传递。例如,当您创建activity_params时,请传入activity_amenity_ids []。 Rails将使用自动生成的#activity_amenity_ids =方法为您处理创建。