Rails обновляет данные в одной модели с контроллера другой модели

#ruby-on-rails #controllers #rails-models

#ruby-on-rails #контроллеры #rails-модели

Вопрос:

У меня есть пользовательская модель, которая имеет billing_id. У меня есть модель заказа, которая запускает транзакции с платежным шлюзом, который возвращает идентификатор выставления счета, который я хотел бы сохранить в столбце billing_id в пользовательской модели. Я думаю, что я путаю основы архитектуры MVC.

У меня сложилось впечатление, что UsersController и OrdersController обновляют данные своих соответствующих таблиц. Означает ли это, что если у меня есть что-то, возвращенное из OrdersController, например, идентификатор выставления счета, нет другого способа сохранить этот идентификатор выставления счета в столбце billing_id в пользовательской модели? Спасибо и извините, если это крайне элементарно. 🙂

Кроме того, я подумал, что возможным решением может быть каким-то образом передать возвращаемое значение через ApplicationsController в UsersController для сохранения в пользовательской таблице. Возможно ли это?

Ответ №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)
  

Комментарии:

1. Спасибо Gazler. Я уже настроил это таким образом. В настоящее время меня беспокоит, как я мог бы получить возвращаемое значение при создании нового заказа и сохранить в пользовательской таблице из OrdersController. Спасибо за ввод

2. Зачем вам нужно сохранять это значение для пользователя? Это не связано с заказом? Не могли бы вы, пожалуйста, уточнить?

3. Да. billingID возвращается, когда номер кредитной карты сохраняется в базе данных платежных шлюзов. Я хотел иметь столбец billingID в таблице User и сохранить его там, а не в таблице Order, потому что billingID возвращается только при сохранении новой кредитной карты.

4. Большое вам спасибо. Итак, возможно ли обновить атрибут пользовательской таблицы из OrdersController? Я думаю, что это фундаментальная проблема MVC, которую я не смог хорошо понять.

5. Я предполагаю, что в вашем OrdersController у вас есть переменная order . Поэтому замените Orders.find(ORDER_ID) на @order .