Each diner should an array or a hash that describes how much they owe to every other diner.
This hash needs to be updated every time an ingredient is added or a payment by that diner is saved to the database.
[opt] it would be even more descriptive to save what ingredients went into the amount owed.
When we settle an amount that was owed (probably in the diner model), here's what should happen:
Validate that the payment is valid (the current owner is the one in debt and the amount about to be paid should be non-zero)
A payment should be created from the current diner to the other diner and then saved to the database.
The hash for both diner needs to be set the appropriate value (not always 0 as @Fortisque suggests because someone might want to pay a lump sum of money)
Okay, here's the deal: