Я везде читал, что бизнес-логика принадлежит моделям, а не контроллеру, но где предел?
Я играю с личным бухгалтерским приложением.
Account
Entry
Operation
При создании операции она действительна только в том случае, если соответствующие записи созданы и связаны с учетными записями, так что операция сбалансирована для примера покупки 6 пакетов:
o=Operation.new({:description=>"b33r", :user=>current_user, :date=>"2008/09/15"})
o.entries.build({:account_id=>1, :amount=>15})
o.valid? #=>false
o.entries.build({:account_id=>2, :amount=>-15})
o.valid? #=>true
Теперь форма, отображаемая пользователю в случае базовых операций , упрощена, чтобы скрыть детали записей, учетные записи выбираются среди 5 по умолчанию по типу операции, запрошенной пользователем (исходная учетная запись) -> Собственный капитал для учета, тратить активы-> расходы, получать доходы-> активы, заемные обязательства-> активы, оплачивать долговые активы-> обязательства ...) Я хочу, чтобы записи создавались из значений по умолчанию.
Я также хочу иметь возможность создавать более сложные операции (более 2 записей). Для этого второго варианта использования у меня будет другая форма, где раскрывается дополнительная сложность. Этот второй вариант использования не позволяет мне включить поле «Дебет и кредит» в Операцию и избавиться от ссылки «Ввод».
Какая форма лучше? Используя приведенный выше код в SimpleOperationController, как я это делаю на данный момент, или определяя новый метод в классе Operation, чтобы я мог вызвать Operation.new_simple_operation (params [: operation])
Не нарушает ли разделение задач фактическое создание объектов Entry и управление ими из класса Operation?
Я не ищу совета по поводу моих искаженных принципов бухгалтерского учета:)
edit - Кажется, я не слишком ясно выразился.
Я не так обеспокоен проверкой. Меня больше волнует, куда должен идти код создания логики:
при условии, что операция на контроллере называется расходом, при использовании расхода хэш параметров будет содержать: сумму, дату, описание. Дебетовые и кредитные счета будут получены из действия, которое вызывается, но тогда я должен создать все объекты. Было бы лучше иметь
#error and transaction handling is left out for the sake of clarity
def spend
amount=params[:operation].delete(:amount)#remove non existent Operation attribute
op=Operation.new(params[:operation])
#select accounts in some way
...
#build entries
op.entries.build(...)
op.entries.build(...)
op.save
end
или создать метод в Operation, который бы выглядел как
def spend
op=Operation.new_simple_operation(params)
op.save
end
это определенно даст гораздо более тонкий контроллер и более толковую модель, но тогда модель будет создавать и хранить экземпляры других моделей, где моя проблема.