这里是情况:
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:请注意,我在表单中使用简单表单的宝石
答案 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])
然后查看结果。请注意,如何在单个交易中创建新活动及其相关活动便利?