Model with two associations?


I'm stumped on this one and after lots of searching and reading I need some help, please!

I'm trying to model a "purchase" as occurring between a "seller" and a "buyer", both of which are instances of a User class.

I have:


Thanks for the attempt. It didn't work, though. Unless I have the "purchases" class set wrong. If I manually create a record in the DB, with two users and one purchase, one as the seller and one as the buyer... and then do:

User.find(1).sales or User.find(1).purchases

I get an error that it is looking for "purchases.seller_type or purchases.buyer_type. But if they are both "User", can't that be set somewhere rather than having seller_type and buyer_type fields on the purchases table?

Actually, I tried setting the seller_type and buyer_type fields on the purchases table and it sort-of works. If I manually create a purchase entry and populate the fields in the DB record, and put "User" for the type fields, then it works. But, if I create a new purchase and give it two users, it creates the record but puts "NULL" in the purchases table for the seller_type and buyer_type. How would these get set to "User"? Or does that need to happen manually?


On the User class? or the Purchase class? I tried it on both and it didn't seem to make a difference... still created the type fields as NULL.

Hmmm... I guess I could explicitly set them: purchase.seller_type = "User" (for example)

But it seems like there's gotta be a cleaner way to set 'em up and have that happen automagically.




Josh, I've read your stuff a TON! (It's really helped me catch up with Rails) I can't believe I didn't think of that very post. I'm gonna go refactor the code that way as it looks like _exactly_ what I need.




Is your example only for Rails 2.0? I'm on 1.2.5, although I probably should just get the 2.0 RC I guess.


Haha! Yup, jumped on 2.0 RC and it works just fine. Well, this app is a long way out from production, so I guess I'll keep it on 2.0.


Thanks, all!

User.find(:first).sales.first # => the first purchase object. Whee!