Snippets
Revised by
Austin
b1a2ba9
I'm going to use PaymentTransaction as the example as I work through the conversion. This way I can note tips and tricks to save some future headache.
Steps
- Change
class PaymentTransaction
toclass PaymentTransaction extends Model
- Running tests after results in a SQL Error about the table
manuscripticon_test.payment_transactions
does not exist.- Add
static $table_name = "<sql table name>"
to class.
- Add
- Running tests after results in a SQL Error about the table
- Remove any private class variables associated with db columns (e.g.
$created
). - For
PaymentTransaction
many of the class variables were named with underscores in the way they are in the databases.- If this is not the case, the getters and setters need to be updated to reference the appropirate column variables. (e.g.
$this->poNumber
would need to become$this->po_number
when the db column is namedpo_number
.- My suggestion would be to keep all of the getters and setters, at least at this point. This will maintain compatability with existing code. I also personally like the getters and setters.
- The next thing I did was run the tests. This caught variables in the FactoryMuffin object that were mis-named. (e.g.
PaymentTransaction
factory usedinvoiceId
and needed to be changed toinvoice_id
. This is more than just in the FactoryMuffin definition, because there was some custom construction of these factories in various test suites.)
- If this is not the case, the getters and setters need to be updated to reference the appropirate column variables. (e.g.
- Remove any default constructors (including constructors where all parameters have default values assigned.
- This will break lots of stuff.
- In tests, I would recommend taking the constructor and substituting it for a Factory object with the parameters set via FactoryMuffin.
- It is probably common that it was called with an existing id in order to load the record. This can be replaced with the ActiveRecord::find($id) method.
- Complex replacements might be easier by passing an array into the ActiveRecord constructor setting attributes.
- With
ItemDiscount
, it was initialized withnew ItemDiscount(0, $lineItemId)
to create a newItemDiscount
based on a previousLineItem
. I solved this with:php new ItemDiscount([ 'discounted_line_item_id => $lineItem->getLineItemId(), ]);
- With
- This will break lots of stuff.
- I elimitated code that would set improper data to an empty string in order to have it remain
null
. (e.g.check_deposit_date
was set to a date if it was valid, else ''. I removed the else and chose to ignore any assignment. It simply staysnull
. - Look through CRUD methods implemented in the class (e.g.
save()
,delete()
, etc). Remove them.PaymentTransaction::save()
was a little more complicated than a simple update of attributes in the database. It also called upon invoice to update its balance.PaymentTransaction::save()
also set thecreated
attribute. I originally put a hook to setcreated
after create, but that overwrote things set in the Factory. Plus there is a default value in the database, so it should be good to leave out.
- If the class is not directly inhereting from model (for instace, ItemDiscount) look for refernces to the parent's entities and make sure those are explicitly made in associations (has_one, has_many, etc.)
Notes
Test Failures
- Many test failures will be resolved easily by remaning properties etc.
- I had test failues due to date issues.
PaymentTransaction::check_deposit_date
was being saved as adate
whilePaymentTransaction::created
wasdatetime
. The switch to ActiveRecord caused some weirdness in the Reporter that had an if/else query on those two fields. The factory was creating a date fromcreated
while expecting it to be a string. Simply setting it as a Date object resolved this issue.
You can clone a snippet to your computer for local editing. Learn more.