gpt4 book ai didi

ruby-on-rails - rails 5 : Displaying form from Joined table

转载 作者:数据小太阳 更新时间:2023-10-29 08:56:44 25 4
gpt4 key购买 nike

这是我第一次涉足连接表和多对多关系,我对 Ruby/Rails 也比较陌生。

这是对之前 question 的直接跟进我在那里建立了适当的相关表/模型。但是为了清楚起见,我将在这里重新定义布局...

我的模型:

订单.rb

class Order < ApplicationRecord
belongs_to :user
has_many :quantities
has_many :meals, through: :quantities
end

膳食.rb

class Meal < ApplicationRecord
has_many :quantities
has_many :orders, through: :quantities
end

数量.rb

class Quantity < ApplicationRecord
belongs_to :order
belongs_to :meal
accepts_nested_attributes_for :quantities
end

用户.rb

class User < ApplicationRecord
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :validatable

has_many :orders
after_create :add_order

def add_order
self.create_order
end

所以每个用户都有 1 个订单,他们可以更新订单上每餐的数量。我需要在“主页”(我已经制作了一个家庭 Controller )上显示所有这些,我得到了这个迭代作为引用:

order.quantities.each do |record|
record.meal.name # for name of associated meal
record.quantity # for quantity of meal
end

但我现在遇到的问题是将这个连接表合并到主 Controller 中,以便页面可以实际显示信息。

在 1 对 1 关系中,我了解如何将相关用户的信息拉到页面上,但在这种多对多关系中,每当我引入相关信息时,我就会迷失逻辑 Controller ,我得到一个 undefined variable 。

我什至不想表现出我的尝试,因为我认为我已经忘记了这种关系的概念。 (迭代示例中使用的方法链接对我来说很有意义,但是如何在 Controller 中处理它,而不是线索)

如果有人可以尝试解释我不明白什么概念,以便我能更好地理解多对多关系,我觉得它可能会澄清我显然也有的许多与 Ruby 相关的困惑。

最佳答案

要显示每个订单和每个订单的数量,您需要做的只是嵌套迭代:

<% user.orders.each do |order| %>
<div class="order">
<p>Ordered at <%= order.created_at %></p>
<% order.quantites.each do |q| %>
<div class="quantity">
<%= q.meal.name >: <%= q.quantity %>
</div>
<% end %>
</div>
<% end %>

您在错误的模型上也有 accepts_nested_attributes。应该是:

class Order < ApplicationRecord
belongs_to :user
has_many :quantities
has_many :meals, through: :quantities
accepts_nested_attributes_for :quantities
end

这使您可以在与订单一起创建嵌套数量:

Order.create(quantities_attributes: [{ meal_id: 1, quantity: 2 }, { meal_id: 3, quantity: 1 }])

您可以像这样设置嵌套表单:

<%= form_with(@order) do |f| %>
<%= fields_for :quantities do |qf| %>
<div class="quantity">
<div class="field">
<%= qf.label :meal_id %>
<%= qf.collection_select :meal_id, Meal.all, :id, :name %>
</div>
<div class="field">
<%= qf.label :quantity %>
<%= qf.number_field :quantity %>
</div>
</div>
<% end %>
<div class="actions">
<%= f.submit %>
</div>
<% end %>

和 Controller :

class OrdersController < ApplicationController

before_action :set_order, only: [:show, :edit, :update, :destroy]

def new
@order = Order.new
# this seeds the form with fields for quantities
10.times { @order.quantities.new }
end

def create
# I'm assuming you have a current_user method
@order = current_user.orders.new(order_params)
if @order.save
redirect_to 'somewhere'
else
render :new
end
end

def update
# I'm assuming you have a current_user method
if @order.update(order_params)
redirect_to 'somewhere'
else
render :new
end
end

private
def set_order
@order = Order.find(params[:order_id])
end

def order_params
params.require(:order).permit(:foo, :bar, quantities_attributes: [:meal_id, :quantity])
end
end

关于ruby-on-rails - rails 5 : Displaying form from Joined table,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53023671/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com