Snippets
Created by
Austin
last modified
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 ItemDiscount::create([ 'discounted_line_item_id => $lineItem->getLineItemId(), ]);
I prefer the Model::create() method over new Model() because it includes a built-in save() giving the instance an id from the beginning which helps with associations and lessens code you have to write around the instance.
- 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.) - Associations sometimes break tests. For instance, making an associate with Invoice's
billing_address
and theAddress
model broke tests where random numbers were used for the billing address. Simply make an instance of the associated model and pass in the id.
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.
Comments (0)
You can clone a snippet to your computer for local editing. Learn more.