I would start with creating some collection class, that will allow using indexers (or even through method_missing) to access product’s custom attributes. Something like that:
my_product.attrs[:size] or my_product.attrs.size
It is easy: instantiate collection class and pass product id to it. Then when you try to access some attributes, just do ProductAttr.find( yada yada ) to get attribute value.
After that you could think even further and implement custom attributes interception in Product’s method_missing (to allow my_product.size).