The bang variant will raise on Not Found. But similar to non-bang version, it does not optimize unneeded queries:
User.find_by_id!(nil) User Load (0.5ms) SELECT "users".* FROM "users" WHERE "users"."id" IS NULL LIMIT 1 ActiveRecord::RecordNotFound: ActiveRecord::RecordNotFound User.find_by_id!('') User Load (0.6ms) SELECT "users".* FROM "users" WHERE "users"."id" = 0 LIMIT 1 ActiveRecord::RecordNotFound: ActiveRecord::RecordNotFound In both of above cases, I think DB query isn't needed. On Sunday, November 9, 2014 1:04:06 PM UTC-8, Ryan Bigg wrote: > > Can’t this be mitigated by using the bang-variant? i.e. `find_by_id!` ? > > > > On Mon, Nov 10, 2014 at 8:03 AM, Eugene Gilburg <eugene....@gmail.com > <javascript:>> wrote: > >> Current behavior: >> >> User.find_by_id(nil) >> User Load (1.1ms) SELECT "users".* FROM "users" WHERE "users"."id" IS >> NULL LIMIT 1 >> >> User.find_by_id("") >> User Load (0.6ms) SELECT "users".* FROM "users" WHERE "users"."id" = 0 >> LIMIT 1 >> >> I realize it's hard to always be able to tell whether given parameter can >> exist or not, but above cases seem like pretty obvious, and also the most >> common cases (e.g. accepting blank param from request), or chaining queries >> where previous query returned nil. >> >> Interestingly enough, User.find(nil) raises right away without queries, >> but not User.find_by_id(nil). >> >> I noticed my code often ends up like: >> >> User.find_by_id(id) if id.present? >> >> This seems like unnecessary cruft that the app should in many cases know >> on its own, at least in following cases: >> >> - Looking up nil on column which has NOT NULL constraint. >> - Looking up blank string on integer db field (common when passing >> request param to query). This will be casted to 0, but unlike explicit >> find_by_id(0), which theoretically could exist in db via manual >> insertion, >> I think it's safe to assume that anyone passing blank string to >> find_by_id >> and friends should expect it to be treated as nil and not 0. >> >> Could Rails check the db schema and know whether nil/blank values are >> possible in db? If not, it could short-circuit or use NullScope to avoid >> making unnecessary query. >> >> 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 <javascript:>. >> To post to this group, send email to rubyonra...@googlegroups.com >> <javascript:>. >> Visit this group at http://groups.google.com/group/rubyonrails-core. >> For more options, visit https://groups.google.com/d/optout. >> > > -- 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-core+unsubscr...@googlegroups.com. To post to this group, send email to rubyonrails-core@googlegroups.com. Visit this group at http://groups.google.com/group/rubyonrails-core. For more options, visit https://groups.google.com/d/optout.