[英]Creating an object with multiple associations on ruby on rails
我是ruby on rails的初学者,我正在尝试创建一个带有2个外部ID(“ user_id”和“ room_id”)的“ Order”表。 到目前为止,我只能随时填写一个外国身份证。
这是模型的代码。
class User < ActiveRecord::Base
has_many: orders, dependent: :destroy
end
class Room < ActiveRecord::Base
has_many: orders, dependent: :destroy
end
class Order < ActiveRecord::Base
belongs_to :user
belongs_to :room
validates :user_id, presence: true
#validates :room_id, presence: true
validates :meal, presence: true
end
这是用户控制器的相关代码
class UsersController < ApplicationController
def current_user
channel_id = session[:channel_id]
@current_user ||= User.find_by(id: channel_id)
end
end
这是房间控制器的相关代码
class RoomsController < ApplicationController
def current_room
room_id = session[:room_id]
@current_room ||= Room.find_by(id: channel_id)
end
end
这是订单控制器的相关代码
class OrdersController < ApplicationController
def new
@order = Order.new
end
def create
@order = current_user.orders.build(order_params) #only user_id column will be filled
#@order = current_room.orders.build(order_params) #only room_id column will be filled
if @order.save
flash[:success] = "Item has been successfully added"
redirect_to all_orders_path
else
flash[:danger] = "Item was not added!"
render 'new'
end
end
private
def order_params
params.require(:ameens_menu).permit(:meal)
end
end
这是订单的代码
<% provide(:title, "Order Form") %>
<div>
<div>
<h1>Place an order</h1>
<%= form_for(@order) do |f| %>
<%= f.label :Meal %>
<%= f.text_field :meal %>
<%= f.submit "Submit my order" %>
<% end %>
</div>
</div>
提交订单时,会同时更新channel_id和room_id,但只能将一个id记录到数据库中。
当我使用@order = current_room.orders.build(order_params)时,表格将如下所示:
| Meal | Room ID | User ID |
|Chicken | 4 | <nil> |
当我使用@order = current_user.orders.build(order_params)时,表格将如下所示:
| Meal | Room ID | User ID |
|Chicken | <nil> | 60 |
有什么方法可以创建对象@order,以便有2个关联,并且数据库表可以这样:
| Meal | Room ID | User ID |
|Chicken | 4 | 60 |
如果我正确理解了您的问题,则可以轻松实现。 在您的控制器中,您可以执行以下操作:
class OrdersController < ApplicationController
# ...
def create
@order = current_user.orders.build(order_params)
@order.room = current_room # association to room set here
if @order.save
flash[:success] = "Item has been successfully added"
redirect_to all_orders_path
else
flash[:danger] = "Item was not added!"
render 'new'
end
end
# ...
end
希望能有所帮助。
祝好运!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.