【问题标题】:Rails Updating Data in one Model from another Model's ControllerRails 从另一个模型的控制器更新一个模型中的数据
【发布时间】:2011-04-07 20:43:23
【问题描述】:

我有一个具有 billing_id 的用户模型。我有 Order 模型,它使用支付网关运行交易,该网关返回我想保存到 User 模型的 billing_id 列中的帐单 ID。我想我把 MVC 架构的基础知识搞混了。

我的印象是 UsersController 和 OrdersController 更新各自表的数据。这是否意味着如果我从 OrdersController 返回了一些东西,例如帐单 ID,没有其他方法可以将该帐单 ID 保存到 User 模型中的 billing_id 列中?感谢和抱歉,如果这是非常基本的。 :)

另外,我认为一个可能的解决方案可能是以某种方式通过 ApplicationsController 将返回值传递到 UsersController 以保存到 User 表中。这可能吗?

【问题讨论】:

    标签: ruby-on-rails controllers rails-models


    【解决方案1】:

    您的用户订单表应该有一个 user_id 实例,因为一个用户可以有多个订单。

    您可以通过创建迁移来做到这一点:

    rails g migration add_user_id_to_orders order_id:integer
    rake db:migrate
    

    您的模型将如下所示:

    class User < ActiveRecord::Base
      has_many :orders
    end
    
    class Order < ActiveRecord::Base
      belongs_to :user
    end
    

    您需要在两者之间建立链接(order_id),否则他们将不知道彼此。这称为外键。

    当事情以这种方式设置时,您可以通过以下方式获得用户:

    User.find(1).orders
    

    您可以通过以下方式从订单中找到用户信息:

    Orders.find(1).user
    

    我希望这会有所帮助。

    编辑:

    Orders.find(ORDER_ID).user.update_attributes(:billing_id => BILLING_ID)
    

    【讨论】:

    • 感谢加兹勒。我已经这样设置了。目前,我关心如何获取新订单创建的返回值并从 OrdersController 保存到用户表中。感谢您的输入
    • 为什么需要将此值保存给用户?它与订单无关吗?你能澄清一下吗?
    • 是的。当信用卡号保存在支付网关数据库中时,会返回 billingID。我想在 User 表中有 billingID 列并将其保存在那里而不是 Order 表中,因为 billingID 只有在保存新信用卡时才会返回。
    • 非常感谢。那么是否可以从 OrdersController 更新用户表的属性?我认为这是一个我无法很好掌握的基本 MVC 问题。
    • 我假设您的 OrdersController 中有一个 order 变量。所以用 @order 替换 Orders.find(ORDER_ID)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多