I just now thought of this, and sure enough it works like a charm (at
least so far in my limited testing):
has_many :events, :dependent => :delete_all
has_many :upcoming_events, :class_name => “Event”, :conditions =>
“date > NOW()”
The purpose of this is that it makes eager loading of subsets of
associations possible without replacing all the magic of the original
association that you may want. If you consider that the number of
events may grow to thousands, but we typically are only interested in
evens in the future, this makes the database queries quite a bit more
efficient. However, when you put conditions on an association like
that, it is enforced globally and suddenly things like :dependent =>
:delete_all will only delete events from the future as well.
I welcome feedback and potential gotchas in using this technique. I’m
also especially interested in documentation on prior uses of this
technique. I googled pretty extensively, but its hard to separate this
particular use from a lot of other issues people are talking about.
I have written a complete writeup on the thought process at:
http://darwinweb.net/article/Subsets_Of_Associations_In_Activerecord
So far I’ve tested it for basic eager loading (even of both
associations at the same time!) and it worked as expected. I also
tested the << operator, and it works.
If you add an :upcoming_event it doesn’t check the conditions, so you
may have to reload. I don’t consider that a bug since it would require
an extra database query, and the behaviour is not unexpected.