如何在Rails 5中获取具有匹配ID的连接表中的记录数

问题描述 投票:0回答:1

我有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 %>

提前致谢!

ruby-on-rails database forms model-view-controller has-many-through
1个回答
1
投票

由于这使用了连接表,我假设您不希望用户实际上能够编辑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关联。

© www.soinside.com 2019 - 2024. All rights reserved.