我正在通过编写一个简单的餐厅应用程序来学习Rails。我有餐厅模型,餐模型和订单模型。我希望能够通过点击某餐旁边的购买按钮向餐厅发送订单。我可以创建一个订单并将其发送到餐厅,但我不知道如何将该订单与餐点联系起来。
这些是模型和路线:
class Order < ActiveRecord::Base
belongs_to :restaurant
end
class Restaurant < ActiveRecord::Base
has_many :meals
has_many :orders
end
class Meal < ActiveRecord::Base
belongs_to :restaurant
end
resources :restaurants do
resources :staff_members
resources :meals
resources :orders
end
餐点列在每餐的下方,我会提交一份表格来创建订单。这肯定是错的,但我找不到如何正确地做到这一点.. 我会非常感谢任何可以提供帮助的人!
答案 0 :(得分:1)
尝试has_many:通过这样的关联。
class Meal < ActiveRecord::Base
has_many :orders
belongs_to :restaurant
end
class Order < ActiveRecord::Base
belongs_to :meal
has_one :restaurant, through: :meal
end
class Restaurant < ActiveRecord::Base
has_many :meals
has_many :orders, through: :meals
end
基本上,你必须创建属于餐馆的餐点。然后,对于餐厅的餐点列表中的每一餐,您将有一个带有按钮的表单。该形式是创建属于相应膳食的订单。反过来,通过上述协会,餐点将自动属于餐厅,因为订单属于餐饮,餐点属于餐厅。
编辑:
(假设您在订单模型中有一个用户名字段作为示例;并且您的路线设置为get '/restaurants/:restaurant_id/meals/:meal_id/orders/new' => 'orders#new'
)
订单控制器
def new
@meal = Meal.find(params[:meal_id])
end
def create
@meal = Meal.find(params[:meal_id])
@order = @meal.orders.build(order_params)
if @order.save
flash[:success] = "Successfully created the order..."
redirect_to root_url
else
flash[:danger] = "Failed to create the order..."
redirect_to request.referrer # Redirects back to the last url
end
end
private
def order_params
params.require(:order).permite(:username, :more_order_fields) # Add other fields for order here
end
新订单表格
<%= form_for(@meal.orders.build) do |order_form| %>
<%= hidden_field_tag :meal_id, params[:meal_id] %>
<%= order_form.label :username %>
<%= order_form.text_field :username %>
<%= order_form.submit "Create Order" %>
<% end %>
我还没有测试过代码。但希望它至少能让你对程序有所了解。
答案 1 :(得分:1)
我的想法是:
meal
属于restaurant
且available_amount
order
时,它有很多餐,但这些餐实际上不是meal
,只是available_amount
餐中的一餐。所以我建议添加一个名为OrderedMeal
的新模型,新模式将如下:
class Order < ActiveRecord::Base
belongs_to :restaurant
has_many :ordered_meals # Change here
end
class Restaurant < ActiveRecord::Base
has_many :meals
has_many :orders
end
class Meal < ActiveRecord::Base
belongs_to :restaurant
end
class OrderedMeal < ActiveRecord::Base
belongs_to :meal
belongs_to :order
end
ordered_meals
即可将订单与订单相关联,然后减少每餐的available_amount
值,我建议available_amount
如果是实际需要!Order
属于Restaurant
可能是多余的,因为您可以从restaurant
获取ordered_meals
信息----&gt; meal
----&gt; restaurant
,您可以考虑将其删除。答案 2 :(得分:1)
我会这样做:
在路线中:
resources :meals do
member do
post :new_order
end
end
现在这将创建一个新的成员路由。现在我将表格提交给这个动作,在meals_controller
我会写:
def new_order
@meal = Meal.find(params[:id]) # Skip if already present in a before_action
if @meal.create_order(current_user)
# success response
else
# error message
end
end
在Meal
模型中创建一个实例方法:
def create_order(user)
# user because obviously order will belong to some user
restaurant.orders.create(meal: self, user: user, other attributes)
end
可能有更好的方法,但我的是这样。并且此代码未经测试可能有错误但会给您一个想法。
希望这有帮助。