I have many tables in my database and I would like to track which user created which object. I know I could use polymorphic relationships between the tables, but I’m not sure of what goes where. Any help?
Ryan Bigg (Radar) wrote:
I have many tables in my database and I would like to track which user created which object. I know I could use polymorphic relationships between the tables, but I'm not sure of what goes where. Any help?
How about a CreatorTable:
t.column :user_id, :integer t.column :type, :string t.column :record_id, :integer
Then derive FooCreatorTable, BarCreatorTable, etc.
Then to find who created Foo 42, you use FooCreatorTable.find_by_record_id(42)
My idea might be a solution in search of a problem, though!
I was thinking something like a properties table with the following:
user_id entity_type entity_id
That I’ve got down pat. I just need to know how to define the relationships in ActiveRecord so I can do stuff like:
e = Employer.find(:first) u = User.find(:first) e.created_by = u e.save
and then it registers that in the properties table.
I figured it would just be easy to add a belongs_to :owner, :class_name => “User” on the model of each object, and then an owner_id field on all the tables instead of trying to find a “simple” work around.
For multiple tables polymorphism can be used for a Creator table; and use after_create hook to add the creator records.
Ryan Bigg wrote:
I figured it would just be easy to add a belongs_to :owner, :class_name => "User" on the model of each object, and then an owner_id field on all the tables instead of trying to find a "simple" work around.
I use simple created_by and updated_by fields on each table populated with current_user.login from restful_authentication
Oh good--I was hoping someone would reply with a simple method for doing this.
So--followup question. I'm guessing that you can't populate these fields in an ActiveRecord callback (before_save) since current_user is a session (and therefore controller) thing. Is that right? If so--what's the most efficient way of populating those fields? Imagine you've got say 11 different models that all have those attributes--is there anything cool and DRY and meta-programmy you can do to make sure those are always populated?
Thanks!
-Roy
Ryan,
Just a reminder [and also for those following along who might not know as well], if you use the association proxy constructors like current_user.foos.build in your controller methods instead of building a Foo and then associating it with the current_user, Rails will take care of it all for you.
RSL
Roy Pardee wrote:
Oh good--I was hoping someone would reply with a simple method for doing this.
So--followup question. I'm guessing that you can't populate these fields in an ActiveRecord callback (before_save) since current_user is a session (and therefore controller) thing. Is that right? If so--what's the most efficient way of populating those fields? Imagine you've got say 11 different models that all have those attributes--is there anything cool and DRY and meta-programmy you can do to make sure those are always populated?
Thanks!
-Roy
Hi Roy,
There was a discussion about this not too long ago in this thread
Maybe that will give you some ideas.
Peace, Phillip
Oh cool--good stuff in there it looks like. Thanks!
-Roy