所以我有两个型号。一个是用餐,第二个叫做食物。一顿饭可以有多种食物,食物可以是多餐。基本上是一个多对多的关联。我通过关联使用has_many做到了这一点。关联模型称为MealFood。 我想制作一个表格,这样当我创建一顿饭时,我可以选择通过复选框或选择选项字段选择任意多的食物。 我怎样才能做到这一点?我对Rails很新,所以我甚至都不知道从哪里开始。任何帮助都会很棒!提前谢谢!
到目前为止,这是我的代码:
class Meal < ApplicationRecord
belongs_to :user
has_many :meal_foods
has_many :foods, through: :meal_foods
end
class Food < ApplicationRecord
has_many :meal_foods
has_many :meals, through: :meal_foods
end
class MealFood < ApplicationRecord
belongs_to :meal
belongs_to :food
end
用餐控制器
def index
end
def new
@meal = Meal.new
@meal.foods.new
end
def create
@meal = Meal.new(meal_params)
if @meal.save
redirect_to @meal
else
render 'new'
end
end
private
def meal_params
params.require(:meal).permit(:meal_type, :date, :total_calories, :total_carbohydrates, :total_fat, foods_attributes: [:name, :calories, :proteins, :carbohydrates, :fat])
end
答案 0 :(得分:1)
您不需要嵌套属性来分配关联。您真正需要的只是复选框或选择:
<%= form_with model: @meal do |f| %>
# ...
<%= f.collection_select(:foods_ids, Food.all, :id, :name) %>
<%= f.submit %>
<% end %>
然后,您需要将属性foods_ids
属性列入白名单:
def food_params
params.require(:food).permit(:foo, :bar, foods_ids: [])
end
这适用于每个多对多关联都有一个_ids
setter,它接受一组id并根据需要替换(或创建)关联。
只有在需要关联记录的传递属性时才需要嵌套属性。