just an idea, you could have 1 contracts table and add a column of type, have all of the fields on the one table, including rent start and end etc...
you could make certain column's null-able so they could remain empty or NULL
then query the table on the type column, this way you can still call all() on contracts and limit your queries at times, since you'd only have the one model Contract...
I do not really agree with jbowman99. But this does not mean it is a bad suggestion or incorrect. It is what I would not do myself.
This is because that I believe more in your approach to have each type separated. (I would make only two tables and have in both rent and sale tables the same columns) Because you will have different models which can have different rules, methods, validation, etc. I think it will make your code much more readable and maintainable if you separated it.