【问题标题】:How to get count of records from join table with matching ID in Rails 5如何在 Rails 5 中从具有匹配 ID 的连接表中获取记录数
【发布时间】:2018-03-05 05:14:02
【问题描述】:

我有 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】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-12
    • 2014-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-14
    • 1970-01-01
    相关资源
    最近更新 更多