I need to be able to match prospective owners to abandoned animals based on varying criteria and locations.
The owner will have a particular criteria set. Animal type = “dog”, breed = “Labrador Retriever”, age will need to be between 1 and 5, sex = male, and so on…
The animal will also have a particular criteria set. The animal type = “Dog”, age = 3, sex = male, breed = “Chihuahua”.
The animal could also be: type = “Cat”, age = “12”, sex = female, breed = “Tiger”.
I also have a “Location” model for both the owner and the animal (polymorphic) that contains the information related to the location of either the animal or the owner.
So that part is easy…
The hard part (at least for me) is when I need to specify different criteria for different animal types. So an animal of type = “dog” may have a criteria of “can fetch?” whereas an animal of type cat may have a criteria of “de-clawed?” and a animal of type “fish” may have criteria of “pattern” with multiple options of [“speckled”, “striped”, “plain”].
What I have now is an “animal” model with the generic animal information (age, sex, breed), then I have a breeds model with the various breeds per animal type, but I can’t figure out how to abstract out the criteria that differs between the animal types.
Again, this is just an analogy because I don’t think my actual problem will make any sense to anyone else. What I need is just some pointers in the right direction, maybe a link or two. I just can’t seem to work out how to make this happen in Rails without creating a separate table for each criteria set, as in dog_criteria, cat_criteria, fish_criteria, and so on…
In the software modeling world, this would obviously be done with a class for each species, I.E. “Dog”, “Cat”, “Fish” which extend “Animal”. In the relational database world, this becomes a bit harder to represent.
If you wanted to match this object-oriented approach in your database, you would have a table for “Animals” and then a table for each species, “Cat”, “Dog”, and “Fish”. Then you would probably have a species table (or a hard-coded enum in your code) that would give you a value to place in the Animal row for which species each animal was. This would tell you how to look up further information for each animal.
This is probably not the best approach. What you have is more what I would call “Custom Data” for each animal. You should define one table that has a list of custom attributes, and another table to match these attributes to a value for each animal row.
If you’d like to make it more convenient to see and control which attributes can apply to which species you could make a third table for “Categories” which would link to the Animal species and to a collection of attributes. Then you would specify the category ID on the animal row.
Sample tables: