Rails模型配置

时间:2016-03-17 18:50:52

标签: ruby-on-rails activerecord reference

我正在通过编写一个简单的餐厅应用程序来学习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

餐点列在每餐的下方,我会提交一份表格来创建订单。这肯定是错的,但我找不到如何正确地做到这一点.. 我会非常感谢任何可以提供帮助的人!

3 个答案:

答案 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属于restaurantavailable_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

可能有更好的方法,但我的是这样。并且此代码未经测试可能有错误但会给您一个想法。

希望这有帮助。