Hi there,
I have some complex situation to solve, and can’t manage to find a way
which satisfy me …
Here’s the problem :
You have to handle many Users (id, name, email, password).
You have a list of many Products (id, name) which are the same for all
users.
You have some Locations (id, user_id, name) of where to put one
product, each user defining his own locations.
BUT
Every user should be able to put his very own “physical instance” of
one product in a location OR NOT, which one will, consequently, be
different for every user. Moreover, he may specify an alternative name
for the product.
So you have to make some model/table that can link product, location,
and user altogether. Let’s call it MyProducts.
IMO there is 2 ways to go, based on the above :
- either you put only the products that have a location in MyProducts
- or you duplicate (badbadbad!) all the products from Products in
MyProducts, and so for each user, which force you to maintain the same
list in both tables, but users and products won’t change too often,
and it will require less work when you have to know which product has
been “modified” or not.
My way of solving this for the moment is the first one :
You have one Product model, that has_many user_products
You have one User model, that has_many user_products
You have one Location model, that has_many user_products
You have one MyProduct model, that belongs_to Product, belongs_to
Location, and belongs_to User
This doesn’t seem too bad, does it ?
The problem is, in your index view, when you want to list all
Products, you have to get an array of all products, and an array of
all my_products, and then subtract the products that exist in
user_product from the products array, so you get only the product not
“modified” by the user, you can display them, and you can then display
those in user_product. But they’re not ordered. So maybe there is some
more work to do so …
And this looks ugly IMO.
So that’s why I’m asking you, how would you do something like that ?
Is it a good idea to do as I did ? This looks like a three way
association, and I’ve been taught to never do that but when you can’t
do anything else.
And above all, is there some Rails-way to do this ? Like using
has_and_belongs_to_many in some cases.
PS : I hope my English isn’t too bad, I did my best