如何在Rails 5中获取具有匹配ID的连接表中的记录数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Rails 5中获取具有匹配ID的连接表中的记录数相关的知识,希望对你有一定的参考价值。
我有2个型号。膳食和食物。一顿饭可以有许多食物,食物可以是许多餐的一部分。他们有一个多对多的关联,由has_many:through完成。连接模型称为MealFood,连接表称为meal_foods。在创建餐时,您可以根据需要添加任意数量的食物。有一个jQuery按钮,当你单击它时会自动在表单中添加一个新输入,然后在那里输入食物项目。如何使用餐的编辑视图显示尽可能多的带有食品名称的输入字段。
膳食控制器:
def create
@meal = current_user.meals.new(meal_params)
if @meal.save
@meal.update(total_calories: @meal.calc_total_calories, total_carbohydrates: @meal.calc_total_carbohydrates, total_proteins: @meal.calc_total_proteins, total_fat: @meal.calc_total_fat)
redirect_to @meal
else
render 'new'
end
end
def edit
@meal = Meal.find(params[:id])
end
def update
if @meal.update(meal_params)
@meal.update(total_calories: @meal.calc_total_calories,
total_carbohydrates: @meal.calc_total_carbohydrates,
total_proteins: @meal.calc_total_proteins,
total_fat: @meal.calc_total_fat)
redirect_to @meal
else
render 'edit'
end
end
餐饮查看(创建操作):
<%= form_for(@meal) do |f| %>
<div class="field">
<%= f.label :meal_type %>
<%= f.select :meal_type, ["Breakfast", "Lunch", "Dinner", "Morning Snack", "Afternoon Snack", "Evening Snack"] %>
</div>
<div class="field">
<label class="input-dropdown">Food Item #1</label>
<%= select_tag "meal[food_ids][]", options_from_collection_for_select(Food.all, "id", "name") %>
</div>
<div class="field submit">
<%= f.submit class: "button button-highlight button-block" %>
</div>
<% end %>
提前致谢!
答案
由于这使用了连接表,我假设您不希望用户实际上能够编辑Food
记录本身 - 他们应该编辑MealFood
记录,对吧?
在这种情况下,您应该能够查询meal.meal_foods以获取要编辑的连接表记录。您的查询可能如下所示:
@meal_foods = @meal.meal_foods.includes(:food)
.includes(:food)
将自动加载您需要的所有食物记录,防止您遇到N + 1查询问题。
然后在您的视图中,您可以执行以下操作:
<div class="field">
<% @meal_foods.each do |mf| %>
<... your input element for each record />
<% end %>
</div>
如果您确实希望您的用户能够自己修改Food
记录,那么您可以使用相同的策略,但只需使用您已创建的through
关联。
以上是关于如何在Rails 5中获取具有匹配ID的连接表中的记录数的主要内容,如果未能解决你的问题,请参考以下文章