França, I'm too late to the party, I thought these bang methods was public on rails 4 :(
We will have people doing wrong things with these methods but a good documentation will reduce that, ruby itself have a lot of these methods like params.merge!(..) or controller_name.gsub!(...) and I never saw people (that do not means there is no people reporting, I just don't saw) reporting issues because things like that. The problem of scopes that must not be mutated can be solved using some freeze implementation on that scope, like this: relation = User.where(:dumb => false).immutable! relation.where!(:dumb => true) #=> raises ActiveRecord::ImmutableRelation I agree that new developers may do strange things but the rails itself is not so easy for beginners, but I have no expertise about how it may impact the community, so if you guys think that won't be great these methods be public, :okaymeme: Gary, What I usually do when "mutable relations" makes sense are filters like that: https://gist.github.com/sobrinho/7318585 On Monday, November 4, 2013 1:01:59 PM UTC-2, Rafael Mendonça França wrote: > > Yes, there is > https://github.com/rails/rails/commit/8c2c60511beaad05a218e73c4918ab89fb1804f0#commitcomment-2211685 > > Rafael Mendonça França > http://twitter.com/rafaelfranca > https://github.com/rafaelfranca > > > On Mon, Nov 4, 2013 at 11:53 AM, Gabriel Sobrinho > <[email protected]<javascript:> > > wrote: > >> França, >> >> There is a reason for that? They sound useful in a lot of scenarios. >> >> On Wednesday, October 30, 2013 2:02:54 PM UTC-2, Rafael Mendonça França >> wrote: >> >>> The bang methods are private and should not be used in applications (see >>> the :nodoc: in the method definition) >>> >>> Rafael Mendonça França >>> http://twitter.com/**rafaelfranca <http://twitter.com/rafaelfranca> >>> https://github.com/**rafaelfranca <https://github.com/rafaelfranca> >>> >>> >>> On Wed, Oct 30, 2013 at 1:51 PM, Gary Weaver <[email protected]> wrote: >>> >>>> I understand that bang methods in the classic Ruby sense are supposed >>>> to alter the current instance, but getting errors like: >>>> >>>> NoMethodError: undefined method `where!' for #<Class:0x007ff1522d3110> >>>> >>>> and >>>> >>>> NoMethodError: undefined method `includes!' for >>>> #<Class:0x007ff1522d3110> >>>> >>>> when calling the bang methods from QueryMethods on a model class are >>>> really not helpful. >>>> >>>> It's understandable that you don't want to pass a model class into a >>>> method that expects a relation that it can act upon and change with a bang >>>> query method and have it successfully create a new relation and call some >>>> method on it that is never again seen, hence the error. I also understand >>>> wanting to avoid any more checking/raising code than necessary in >>>> ActiveRecord both for maintainability, clarity, and maybe efficiency- but >>>> just look at this: >>>> >>>> 2.0.0p247 :001 > MyModel.to_s >>>> => "MyModel" >>>> 2.0.0p247 :002 > MyModel.new.to_s >>>> => "#< MyModel:0x007fc92aa017e8>"** >>>> 2.0.0p247 :003 > MyModel.where({}) >>>> => ... >>>> 2.0.0p247 :003 > MyModel.where!({}) >>>> NoMethodError: undefined method `where!' for #<Class:0x007fc92a95a240> >>>> >>>> Thanks! >>>> >>>> -- >>>> You received this message because you are subscribed to the Google >>>> Groups "Ruby on Rails: Core" group. >>>> To unsubscribe from this group and stop receiving emails from it, send >>>> an email to rubyonrails-co...@**googlegroups.com. >>>> To post to this group, send email to rubyonra...@googlegroups.**com. >>>> >>>> Visit this group at >>>> http://groups.google.com/**group/rubyonrails-core<http://groups.google.com/group/rubyonrails-core> >>>> . >>>> For more options, visit >>>> https://groups.google.com/**groups/opt_out<https://groups.google.com/groups/opt_out> >>>> . >>>> >>> >>> -- >> You received this message because you are subscribed to the Google Groups >> "Ruby on Rails: Core" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to [email protected] <javascript:>. >> To post to this group, send email to >> [email protected]<javascript:> >> . >> Visit this group at http://groups.google.com/group/rubyonrails-core. >> For more options, visit https://groups.google.com/groups/opt_out. >> > > -- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Core" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at http://groups.google.com/group/rubyonrails-core. For more options, visit https://groups.google.com/groups/opt_out.
