Мне интересно, есть ли способ по-разному представлять модель (или, возможно, контролировать доступ на уровне полей) в зависимости от ее состояния (экземпляра модели) и контроллера, использующего ее.
Пример:
Представьте, что у нас есть модель Order
с полями product_id
, count
, price
и status
.status
может быть одним из: :new
, :confirmed
, :accepted
, :cancelled
, :delivered
и :closed
.
Приложение может получить доступ к Order
, скажем, с двух контроллеровCustomerOrdersController
и SellerOrdersController
.Таким образом, CustomerOrdersController
может создавать и редактировать заказы.Но в состоянии изменить только count
поле.С другой стороны, SellerOrdersController
может редактировать заказы.Но в состоянии изменить только ценовое поле.Т.е. было бы замечательно, если бы экземпляр класса Order
, с которым работает CustomerOrdersController
, не имел метода price=
.То же самое для count=
(product=
) и SellerOrderController
.
Дальнейший набор столбцов, разрешенных для редактирования, зависит от поля состояния (вероятно, работает для некоторого конечного автомата).
Итак,вопрос: как бы вы сделали это в своем приложении?
PS
Я думаю о некоторых ActiveModel
прокси-объектах для ActiveRecord
случаи, но не знаю, на самом деле это будет работать или нет.Рассмотрим:
class CustomerOrderProxy < ActiveModel::Base end
class SellerOrderProxy < ActiveModel::Base end
class Order < ActiveRecord::Base
def wrap_proxy(controller_user)
controller_user == CustomerOrdersController ? CustomerOrderProxy(self) : SellerOrderProxy(self)
end
end
Другой подход заключается в том, чтобы выполнять тонны проверок и params
проверок внутри действий контроллера, но я не хочу.Я верю в "Толстую модель - тощий контроллер":)
PPS
Я знаю, что в ruby есть много плагинов конечных автоматов, но AFAI понимает, что они определяют только переходы, а ненабор методов (т.е. представление) объекта.