I've made a couple of fixes ( some are really straight forward ) for HMT relations - would be great if someone can check and commit/comment.
http://dev.rubyonrails.org/ticket/8785 http://dev.rubyonrails.org/ticket/8786 http://dev.rubyonrails.org/ticket/8787 http://dev.rubyonrails.org/ticket/8800 http://dev.rubyonrails.org/ticket/8801 http://dev.rubyonrails.org/ticket/8802
I'm more interested in knowing the thoughts that went behind adding create! for HMT. Logically/intuitively speaking, if create! is supported then build, create, << should be supported too.
But create! works only when the source association is minimal and has no validation ( just like habtm join table, only with id) - and polymorphic ( it tries to find source_id in source table otherwise! ) . I think it needs a bit of rethinking and cases/conditions where it actually work, should be properly defined/documented, as the current behavior is totally unexpected.
I personally feel any method that bypasses source reflection logic, should raise exception as default behavior. But at the same time, user should probably be given an option to override the behavior, may be something like :
has_many :comments, :through => :posts, :writer => [:create, :new]
But then user should know what he's doing if he uses it. Or even better, just let users define their own methods and allow nothing by default.