Updated README.rdoc again
[feedcatcher.git] / vendor / rails / activerecord / CHANGELOG
1 *2.3.2 [Final] (March 15, 2009)*
2
3 * Added ActiveRecord::Base.find_each and ActiveRecord::Base.find_in_batches for batch processing [DHH/Jamis Buck]
4
5 * Added that ActiveRecord::Base.exists? can be called with no arguments #1817 [Scott Taylor]
6
7 * Add Support for updating deeply nested models from a single form. #1202 [Eloy Duran]
8
9 class Book < ActiveRecord::Base
10 has_one :author
11 has_many :pages
12
13 accepts_nested_attributes_for :author, :pages
14 end
15
16 * Make after_save callbacks fire only if the record was successfully saved. #1735 [Michael Lovitt]
17
18 Previously the callbacks would fire if a before_save cancelled saving.
19
20 * Support nested transactions using database savepoints. #383 [Jonathan Viney, Hongli Lai]
21
22 * Added dynamic scopes ala dynamic finders #1648 [Yaroslav Markin]
23
24 * Fixed that ActiveRecord::Base#new_record? should return false (not nil) for existing records #1219 [Yaroslav Markin]
25
26 * I18n the word separator for error messages. Introduces the activerecord.errors.format.separator translation key. #1294 [Akira Matsuda]
27
28 * Add :having as a key to find and the relevant associations. [Emilio Tagua]
29
30 * Added default_scope to Base #1381 [Paweł Kondzior]. Example:
31
32 class Person < ActiveRecord::Base
33 default_scope :order => 'last_name, first_name'
34 end
35
36 class Company < ActiveRecord::Base
37 has_many :people
38 end
39
40 Person.all # => Person.find(:all, :order => 'last_name, first_name')
41 Company.find(1).people # => Person.find(:all, :order => 'last_name, first_name', :conditions => { :company_id => 1 })
42
43
44 *2.2.1 [RC2] (November 14th, 2008)*
45
46 * Ensure indices don't flip order in schema.rb #1266 [Jordi Bunster]
47
48 * Fixed that serialized strings should never be type-casted (i.e. turning "Yes" to a boolean) #857 [Andreas Korth]
49
50
51 *2.2.0 [RC1] (October 24th, 2008)*
52
53 * Skip collection ids reader optimization if using :finder_sql [Jeremy Kemper]
54
55 * Add Model#delete instance method, similar to Model.delete class method. #1086 [Hongli Lai (Phusion)]
56
57 * MySQL: cope with quirky default values for not-null text columns. #1043 [Frederick Cheung]
58
59 * Multiparameter attributes skip time zone conversion for time-only columns [#1030 state:resolved] [Geoff Buesing]
60
61 * Base.skip_time_zone_conversion_for_attributes uses class_inheritable_accessor, so that subclasses don't overwrite Base [#346 state:resolved] [Emilio Tagua]
62
63 * Added find_last_by dynamic finder #762 [Emilio Tagua]
64
65 * Internal API: configurable association options and build_association method for reflections so plugins may extend and override. #985 [Hongli Lai (Phusion)]
66
67 * Changed benchmarks to be reported in milliseconds [David Heinemeier Hansson]
68
69 * Connection pooling. #936 [Nick Sieger]
70
71 * Merge scoped :joins together instead of overwriting them. May expose scoping bugs in your code! #501 [Andrew White]
72
73 * before_save, before_validation and before_destroy callbacks that return false will now ROLLBACK the transaction. Previously this would have been committed before the processing was aborted. #891 [Xavier Noria]
74
75 * Transactional migrations for databases which support them. #834 [divoxx, Adam Wiggins, Tarmo Tänav]
76
77 * Set config.active_record.timestamped_migrations = false to have migrations with numeric prefix instead of UTC timestamp. #446. [Andrew Stone, Nik Wakelin]
78
79 * change_column_default preserves the not-null constraint. #617 [Tarmo Tänav]
80
81 * Fixed that create database statements would always include "DEFAULT NULL" (Nick Sieger) [#334]
82
83 * Add :tokenizer option to validates_length_of to specify how to split up the attribute string. #507. [David Lowenfels] Example :
84
85 # Ensure essay contains at least 100 words.
86 validates_length_of :essay, :minimum => 100, :too_short => "Your essay must be at least %d words."), :tokenizer => lambda {|str| str.scan(/\w+/) }
87
88 * Allow conditions on multiple tables to be specified using hash. [Pratik Naik]. Example:
89
90 User.all :joins => :items, :conditions => { :age => 10, :items => { :color => 'black' } }
91 Item.first :conditions => { :items => { :color => 'red' } }
92
93 * Always treat integer :limit as byte length. #420 [Tarmo Tänav]
94
95 * Partial updates don't update lock_version if nothing changed. #426 [Daniel Morrison]
96
97 * Fix column collision with named_scope and :joins. #46 [Duncan Beevers, Mark Catley]
98
99 * db:migrate:down and :up update schema_migrations. #369 [Michael Raidel, RaceCondition]
100
101 * PostgreSQL: support :conditions => [':foo::integer', { :foo => 1 }] without treating the ::integer typecast as a bind variable. [Tarmo Tänav]
102
103 * MySQL: rename_column preserves column defaults. #466 [Diego Algorta]
104
105 * Add :from option to calculations. #397 [Ben Munat]
106
107 * Add :validate option to associations to enable/disable the automatic validation of associated models. Resolves #301. [Jan De Poorter]
108
109 * PostgreSQL: use 'INSERT ... RETURNING id' for 8.2 and later. [Jeremy Kemper]
110
111 * Added SQL escaping for :limit and :offset in MySQL [Jonathan Wiess]
112
113
114 *2.1.0 (May 31st, 2008)*
115
116 * Add ActiveRecord::Base.sti_name that checks ActiveRecord::Base#store_full_sti_class? and returns either the full or demodulized name. [Rick Olson]
117
118 * Add first/last methods to associations/named_scope. Resolved #226. [Ryan Bates]
119
120 * Added SQL escaping for :limit and :offset #288 [Aaron Bedra, Steven Bristol, Jonathan Wiess]
121
122 * Added first/last methods to associations/named_scope. Resolved #226. [Ryan Bates]
123
124 * Ensure hm:t preloading honours reflection options. Resolves #137. [Frederick Cheung]
125
126 * Added protection against duplicate migration names (Aslak Hellesøy) [#112]
127
128 * Base#instantiate_time_object: eliminate check for Time.zone, since we can assume this is set if time_zone_aware_attributes is set to true [Geoff Buesing]
129
130 * Time zone aware attribute methods use Time.zone.parse instead of #to_time for String arguments, so that offset information in String is respected. Resolves #105. [Scott Fleckenstein, Geoff Buesing]
131
132 * Added change_table for migrations (Jeff Dean) [#71]. Example:
133
134 change_table :videos do |t|
135 t.timestamps # adds created_at, updated_at
136 t.belongs_to :goat # adds goat_id integer
137 t.string :name, :email, :limit => 20 # adds name and email both with a 20 char limit
138 t.remove :name, :email # removes the name and email columns
139 end
140
141 * Fixed has_many :through .create with no parameters caused a "can't dup NilClass" error (Steven Soroka) [#85]
142
143 * Added block-setting of attributes for Base.create like Base.new already has (Adam Meehan) [#39]
144
145 * Fixed that pessimistic locking you reference the quoted table name (Josh Susser) [#67]
146
147 * Fixed that change_column should be able to use :null => true on a field that formerly had false [Nate Wiger] [#26]
148
149 * Added that the MySQL adapter should map integer to either smallint, int, or bigint depending on the :limit just like PostgreSQL [David Heinemeier Hansson]
150
151 * Change validates_uniqueness_of :case_sensitive option default back to true (from [9160]). Love your database columns, don't LOWER them. [Rick Olson]
152
153 * Add support for interleaving migrations by storing which migrations have run in the new schema_migrations table. Closes #11493 [Jordi Bunster]
154
155 * ActiveRecord::Base#sum defaults to 0 if no rows are returned. Closes #11550 [Kamal Fariz Mahyuddin]
156
157 * Ensure that respond_to? considers dynamic finder methods. Closes #11538. [James Mead]
158
159 * Ensure that save on parent object fails for invalid has_one association. Closes #10518. [Pratik Naik]
160
161 * Remove duplicate code from associations. [Pratik Naik]
162
163 * Refactor HasManyThroughAssociation to inherit from HasManyAssociation. Association callbacks and <association>_ids= now work with hm:t. #11516 [Ruy Asan]
164
165 * Ensure HABTM#create and HABTM#build do not load entire association. [Pratik Naik]
166
167 * Improve documentation. [Xavier Noria, Jack Danger Canty, leethal]
168
169 * Tweak ActiveRecord::Base#to_json to include a root value in the returned hash: {"post": {"title": ...}} [Rick Olson]
170
171 Post.find(1).to_json # => {"title": ...}
172 config.active_record.include_root_in_json = true
173 Post.find(1).to_json # => {"post": {"title": ...}}
174
175 * Add efficient #include? to AssociationCollection (for has_many/has_many :through/habtm). [stopdropandrew]
176
177 * PostgreSQL: create_ and drop_database support. #9042 [ez, pedz, Nick Sieger]
178
179 * Ensure that validates_uniqueness_of works with with_scope. Closes #9235. [Nik Wakelin, cavalle]
180
181 * Partial updates include only unsaved attributes. Off by default; set YourClass.partial_updates = true to enable. [Jeremy Kemper]
182
183 * Removing unnecessary uses_tzinfo helper from tests, given that TZInfo is now bundled [Geoff Buesing]
184
185 * Fixed that validates_size_of :within works in associations #11295, #10019 [cavalle]
186
187 * Track changes to unsaved attributes. [Jeremy Kemper]
188
189 * Switched to UTC-timebased version numbers for migrations and the schema. This will as good as eliminate the problem of multiple migrations getting the same version assigned in different branches. Also added rake db:migrate:up/down to apply individual migrations that may need to be run when you merge branches #11458 [John Barnette]
190
191 * Fixed that has_many :through would ignore the hash conditions #11447 [Emilio Tagua]
192
193 * Fix issue where the :uniq option of a has_many :through association is ignored when find(:all) is called. Closes #9407 [cavalle]
194
195 * Fix duplicate table alias error when including an association with a has_many :through association on the same join table. Closes #7310 [cavalle]
196
197 * More efficient association preloading code that compacts a through_records array in a central location. Closes #11427 [Jack Danger Canty]
198
199 * Improve documentation. [Ryan Bigg, Jan De Poorter, Cheah Chu Yeow, Xavier Shay, Jack Danger Canty, Emilio Tagua, Xavier Noria, Sunny Ripert]
200
201 * Fixed that ActiveRecord#Base.find_or_create/initialize would not honor attr_protected/accessible when used with a hash #11422 [Emilio Tagua]
202
203 * Added ActiveRecord#Base.all/first/last as aliases for find(:all/:first/:last) #11413 [nkallen, Chris O'Sullivan]
204
205 * Merge the has_finder gem, renamed as 'named_scope'. #11404 [nkallen]
206
207 class Article < ActiveRecord::Base
208 named_scope :published, :conditions => {:published => true}
209 named_scope :popular, :conditions => ...
210 end
211
212 Article.published.paginate(:page => 1)
213 Article.published.popular.count
214 Article.popular.find(:first)
215 Article.popular.find(:all, :conditions => {...})
216
217 See http://pivots.pivotallabs.com/users/nick/blog/articles/284-hasfinder-it-s-now-easier-than-ever-to-create-complex-re-usable-sql-queries
218
219 * Add has_one :through support. #4756 [Chris O'Sullivan]
220
221 * Migrations: create_table supports primary_key_prefix_type. #10314 [student, Chris O'Sullivan]
222
223 * Added logging for dependency load errors with fixtures #11056 [stuthulhu]
224
225 * Time zone aware attributes use Time#in_time_zone [Geoff Buesing]
226
227 * Fixed that scoped joins would not always be respected #6821 [Theory/Jack Danger Canty]
228
229 * Ensure that ActiveRecord::Calculations disambiguates field names with the table name. #11027 [cavalle]
230
231 * Added add/remove_timestamps to the schema statements for adding the created_at/updated_at columns on existing tables #11129 [jramirez]
232
233 * Added ActiveRecord::Base.find(:last) #11338 [Emilio Tagua]
234
235 * test_native_types expects DateTime.local_offset instead of DateTime.now.offset; fixes test breakage due to dst transition [Geoff Buesing]
236
237 * Add :readonly option to HasManyThrough associations. #11156 [Emilio Tagua]
238
239 * Improve performance on :include/:conditions/:limit queries by selectively joining in the pre-query. #9560 [dasil003]
240
241 * Perf fix: Avoid the use of named block arguments. Closes #11109 [adymo]
242
243 * PostgreSQL: support server versions 7.4 through 8.0 and the ruby-pg driver. #11127 [jdavis]
244
245 * Ensure association preloading doesn't break when an association returns nil. ##11145 [GMFlash]
246
247 * Make dynamic finders respect the :include on HasManyThrough associations. #10998. [cpytel]
248
249 * Base#instantiate_time_object only uses Time.zone when Base.time_zone_aware_attributes is true; leverages Time#time_with_datetime_fallback for readability [Geoff Buesing]
250
251 * Refactor ConnectionAdapters::Column.new_time: leverage DateTime failover behavior of Time#time_with_datetime_fallback [Geoff Buesing]
252
253 * Improve associations performance by using symbol callbacks instead of string callbacks. #11108 [adymo]
254
255 * Optimise the BigDecimal conversion code. #11110 [adymo]
256
257 * Introduce the :readonly option to all associations. Records from the association cannot be saved. #11084 [Emilio Tagua]
258
259 * Multiparameter attributes for time columns fail over to DateTime when out of range of Time [Geoff Buesing]
260
261 * Base#instantiate_time_object uses Time.zone.local() [Geoff Buesing]
262
263 * Add timezone-aware attribute readers and writers. #10982 [Geoff Buesing]
264
265 * Instantiating time objects in multiparameter attributes uses Time.zone if available. #10982 [Rick Olson]
266
267 * Add note about how ActiveRecord::Observer classes are initialized in a Rails app. #10980 [Xavier Noria]
268
269 * MySQL: omit text/blob defaults from the schema instead of using an empty string. #10963 [mdeiters]
270
271 * belongs_to supports :dependent => :destroy and :delete. #10592 [Jonathan Viney]
272
273 * Introduce preload query strategy for eager :includes. #9640 [Frederick Cheung, Aliaksey Kandratsenka, codafoo]
274
275 * Support aggregations in finder conditions. #10572 [Ryan Kinderman]
276
277 * Organize and clean up the Active Record test suite. #10742 [John Barnette]
278
279 * Ensure that modifying has_and_belongs_to_many actions clear the query cache. Closes #10840 [john.andrews]
280
281 * Fix issue where Table#references doesn't pass a :null option to a *_type attribute for polymorphic associations. Closes #10753 [railsjitsu]
282
283 * Fixtures: removed support for the ancient pre-YAML file format. #10736 [John Barnette]
284
285 * More thoroughly quote table names. #10698 [dimdenis, lotswholetime, Jeremy Kemper]
286
287 * update_all ignores scoped :order and :limit, so post.comments.update_all doesn't try to include the comment order in the update statement. #10686 [Brendan Ribera]
288
289 * Added ActiveRecord::Base.cache_key to make it easier to cache Active Records in combination with the new ActiveSupport::Cache::* libraries [David Heinemeier Hansson]
290
291 * Make sure CSV fixtures are compatible with ruby 1.9's new csv implementation. [JEG2]
292
293 * Added by parameter to increment, decrement, and their bang varieties so you can do player1.increment!(:points, 5) #10542 [Sam]
294
295 * Optimize ActiveRecord::Base#exists? to use #select_all instead of #find. Closes #10605 [jamesh, Frederick Cheung, protocool]
296
297 * Don't unnecessarily load has_many associations in after_update callbacks. Closes #6822 [stopdropandrew, canadaduane]
298
299 * Eager belongs_to :include infers the foreign key from the association name rather than the class name. #10517 [Jonathan Viney]
300
301 * SQLite: fix rename_ and remove_column for columns with unique indexes. #10576 [Brandon Keepers]
302
303 * Ruby 1.9 compatibility. #10655 [Jeremy Kemper, Dirkjan Bussink]
304
305
306 *2.0.2* (December 16th, 2007)
307
308 * Ensure optimistic locking handles nil #lock_version values properly. Closes #10510 [Rick Olson]
309
310 * Make the Fixtures Test::Unit enhancements more supporting for double-loaded test cases. Closes #10379 [brynary]
311
312 * Fix that validates_acceptance_of still works for non-existent tables (useful for bootstrapping new databases). Closes #10474 [Josh Susser]
313
314 * Ensure that the :uniq option for has_many :through associations retains the order. #10463 [remvee]
315
316 * Base.exists? doesn't rescue exceptions to avoid hiding SQL errors. #10458 [Michael Klishin]
317
318 * Documentation: Active Record exceptions, destroy_all and delete_all. #10444, #10447 [Michael Klishin]
319
320
321 *2.0.1* (December 7th, 2007)
322
323 * Removed query cache rescue as it could cause code to be run twice (closes #10408) [David Heinemeier Hansson]
324
325
326 *2.0.0* (December 6th, 2007)
327
328 * Anchor DateTimeTest to fixed DateTime instead of a variable value based on Time.now#advance#to_datetime, so that this test passes on 64-bit platforms running Ruby 1.8.6+ [Geoff Buesing]
329
330 * Fixed that the Query Cache should just be ignored if the database is misconfigured (so that the "About your applications environment" works even before the database has been created) [David Heinemeier Hansson]
331
332 * Fixed that the truncation of strings longer than 50 chars should use inspect
333 so newlines etc are escaped #10385 [Norbert Crombach]
334
335 * Fixed that habtm associations should be able to set :select as part of their definition and have that honored [David Heinemeier Hansson]
336
337 * Document how the :include option can be used in Calculations::calculate. Closes #7446 [adamwiggins, ultimoamore]
338
339 * Fix typo in documentation for polymorphic associations w/STI. Closes #7461 [johnjosephbachir]
340
341 * Reveal that the type option in migrations can be any supported column type for your database but also include caveat about agnosticism. Closes #7531 [adamwiggins, mikong]
342
343 * More complete documentation for find_by_sql. Closes #7912 [fearoffish]
344
345 * Added ActiveRecord::Base#becomes to turn a record into one of another class (mostly relevant for STIs) [David Heinemeier Hansson]. Example:
346
347 render :partial => @client.becomes(Company) # renders companies/company instead of clients/client
348
349 * Fixed that to_xml should not automatically pass :procs to associations included with :include #10162 [Cheah Chu Yeow]
350
351 * Fix documentation typo introduced in [8250]. Closes #10339 [Henrik N]
352
353 * Foxy fixtures: support single-table inheritance. #10234 [tom]
354
355 * Foxy fixtures: allow mixed usage to make migration easier and more attractive. #10004 [lotswholetime]
356
357 * Make the record_timestamps class-inheritable so it can be set per model. #10004 [tmacedo]
358
359 * Allow validates_acceptance_of to use a real attribute instead of only virtual (so you can record that the acceptance occured) #7457 [ambethia]
360
361 * DateTimes use Ruby's default calendar reform setting. #10201 [Geoff Buesing]
362
363 * Dynamic finders on association collections respect association :order and :limit. #10211, #10227 [Patrick Joyce, Rick Olson, Jack Danger Canty]
364
365 * Add 'foxy' support for fixtures of polymorphic associations. #10183 [John Barnette, David Lowenfels]
366
367 * validates_inclusion_of and validates_exclusion_of allow formatted :message strings. #8132 [devrieda, Mike Naberezny]
368
369 * attr_readonly behaves well with optimistic locking. #10188 [Nick Bugajski]
370
371 * Base#to_xml supports the nil="true" attribute like Hash#to_xml. #8268 [Jonathan del Strother]
372
373 * Change plings to the more conventional quotes in the documentation. Closes #10104 [Jack Danger Canty]
374
375 * Fix HasManyThrough Association so it uses :conditions on the HasMany Association. Closes #9729 [Jack Danger Canty]
376
377 * Ensure that column names are quoted. Closes #10134 [wesley.moxam]
378
379 * Smattering of grammatical fixes to documentation. Closes #10083 [Bob Silva]
380
381 * Enhance explanation with more examples for attr_accessible macro. Closes #8095 [fearoffish, Marcel Molina Jr.]
382
383 * Update association/method mapping table to refected latest collection methods for has_many :through. Closes #8772 [Pratik Naik]
384
385 * Explain semantics of having several different AR instances in a transaction block. Closes #9036 [jacobat, Marcel Molina Jr.]
386
387 * Update Schema documentation to use updated sexy migration notation. Closes #10086 [Sam Granieri]
388
389 * Make fixtures work with the new test subclasses. [Tarmo Tänav, Michael Koziarski]
390
391 * Introduce finder :joins with associations. Same :include syntax but with inner rather than outer joins. #10012 [RubyRedRick]
392 # Find users with an avatar
393 User.find(:all, :joins => :avatar)
394
395 # Find posts with a high-rated comment.
396 Post.find(:all, :joins => :comments, :conditions => 'comments.rating > 3')
397
398 * Associations: speedup duplicate record check. #10011 [Pratik Naik]
399
400 * Make sure that << works on has_many associations on unsaved records. Closes #9989 [Josh Susser]
401
402 * Allow association redefinition in subclasses. #9346 [wildchild]
403
404 * Fix has_many :through delete with custom foreign keys. #6466 [naffis]
405
406 * Foxy fixtures, from rathole (http://svn.geeksomnia.com/rathole/trunk/README)
407 - stable, autogenerated IDs
408 - specify associations (belongs_to, has_one, has_many) by label, not ID
409 - specify HABTM associations as inline lists
410 - autofill timestamp columns
411 - support YAML defaults
412 - fixture label interpolation
413 Enabled for fixtures that correspond to a model class and don't specify a primary key value. #9981 [John Barnette]
414
415 * Add docs explaining how to protect all attributes using attr_accessible with no arguments. Closes #9631 [boone, rmm5t]
416
417 * Update add_index documentation to use new options api. Closes #9787 [Kamal Fariz Mahyuddin]
418
419 * Allow find on a has_many association defined with :finder_sql to accept id arguments as strings like regular find does. Closes #9916 [krishna]
420
421 * Use VALID_FIND_OPTIONS when resolving :find scoping rather than hard coding the list of valid find options. Closes #9443 [sur]
422
423 * Limited eager loading no longer ignores scoped :order. Closes #9561 [Jack Danger Canty, Josh Peek]
424
425 * Assigning an instance of a foreign class to a composed_of aggregate calls an optional conversion block. Refactor and simplify composed_of implementation. #6322 [brandon, Chris Cruft]
426
427 * Assigning nil to a composed_of aggregate also sets its immediate value to nil. #9843 [Chris Cruft]
428
429 * Ensure that mysql quotes table names with database names correctly. Closes #9911 [crayz]
430
431 "foo.bar" => "`foo`.`bar`"
432
433 * Complete the assimilation of Sexy Migrations from ErrFree [Chris Wanstrath, PJ Hyett]
434 http://errtheblog.com/post/2381
435
436 * Qualified column names work in hash conditions, like :conditions => { 'comments.created_at' => ... }. #9733 [Jack Danger Canty]
437
438 * Fix regression where the association would not construct new finder SQL on save causing bogus queries for "WHERE owner_id = NULL" even after owner was saved. #8713 [Bryan Helmkamp]
439
440 * Refactor association create and build so before & after callbacks behave consistently. #8854 [Pratik Naik, mortent]
441
442 * Quote table names. Defaults to column quoting. #4593 [Justin Lynn, gwcoffey, eadz, Dmitry V. Sabanin, Jeremy Kemper]
443
444 * Alias association #build to #new so it behaves predictably. #8787 [Pratik Naik]
445
446 * Add notes to documentation regarding attr_readonly behavior with counter caches and polymorphic associations. Closes #9835 [saimonmoore, Rick Olson]
447
448 * Observers can observe model names as symbols properly now. Closes #9869 [queso]
449
450 * find_and_(initialize|create)_by methods can now properly initialize protected attributes [Tobias Lütke]
451
452 * belongs_to infers the foreign key from the association name instead of from the class name. [Jeremy Kemper]
453
454 * PostgreSQL: support multiline default values. #7533 [Carl Lerche, aguynamedryan, Rein Henrichs, Tarmo Tänav]
455
456 * MySQL: fix change_column on not-null columns that don't accept dfeault values of ''. #6663 [Jonathan Viney, Tarmo Tänav]
457
458 * validates_uniqueness_of behaves well with abstract superclasses and
459 single-table inheritance. #3833, #9886 [Gabriel Gironda, rramdas, François Beausoleil, Josh Peek, Tarmo Tänav, pat]
460
461 * Warn about protected attribute assigments in development and test environments when mass-assigning to an attr_protected attribute. #9802 [Henrik N]
462
463 * Speedup database date/time parsing. [Jeremy Kemper, Tarmo Tänav]
464
465 * Fix calling .clear on a has_many :dependent=>:delete_all association. [Tarmo Tänav]
466
467 * Allow change_column to set NOT NULL in the PostgreSQL adapter [Tarmo Tänav]
468
469 * Fix that ActiveRecord would create attribute methods and override custom attribute getters if the method is also defined in Kernel.methods. [Rick Olson]
470
471 * Don't call attr_readonly on polymorphic belongs_to associations, in case it matches the name of some other non-ActiveRecord class/module. [Rick Olson]
472
473 * Try loading activerecord-<adaptername>-adapter gem before trying a plain require so you can use custom gems for the bundled adapters. Also stops gems from requiring an adapter from an old Active Record gem. [Jeremy Kemper, Derrick Spell]
474
475
476 *2.0.0 [Preview Release]* (September 29th, 2007) [Includes duplicates of changes from 1.14.2 - 1.15.3]
477
478 * Add attr_readonly to specify columns that are skipped during a normal ActiveRecord #save operation. Closes #6896 [Dan Manges]
479
480 class Comment < ActiveRecord::Base
481 # Automatically sets Article#comments_count as readonly.
482 belongs_to :article, :counter_cache => :comments_count
483 end
484
485 class Article < ActiveRecord::Base
486 attr_readonly :approved_comments_count
487 end
488
489 * Make size for has_many :through use counter cache if it exists. Closes #9734 [Xavier Shay]
490
491 * Remove DB2 adapter since IBM chooses to maintain their own adapter instead. [Jeremy Kemper]
492
493 * Extract Oracle, SQLServer, and Sybase adapters into gems. [Jeremy Kemper]
494
495 * Added fixture caching that'll speed up a normal fixture-powered test suite between 50% and 100% #9682 [Frederick Cheung]
496
497 * Correctly quote id list for limited eager loading. #7482 [tmacedo]
498
499 * Fixed that using version-targetted migrates would fail on loggers other than the default one #7430 [valeksenko]
500
501 * Fixed rename_column for SQLite when using symbols for the column names #8616 [drodriguez]
502
503 * Added the possibility of using symbols in addition to concrete classes with ActiveRecord::Observer#observe. #3998 [Robby Russell, Tarmo Tänav]
504
505 * Added ActiveRecord::Base#to_json/from_json [David Heinemeier Hansson, Cheah Chu Yeow]
506
507 * Added ActiveRecord::Base#from_xml [David Heinemeier Hansson]. Example:
508
509 xml = "<person><name>David</name></person>"
510 Person.new.from_xml(xml).name # => "David"
511
512 * Define dynamic finders as real methods after first usage. [bscofield]
513
514 * Deprecation: remove deprecated threaded_connections methods. Use allow_concurrency instead. [Jeremy Kemper]
515
516 * Associations macros accept extension blocks alongside modules. #9346 [Josh Peek]
517
518 * Speed up and simplify query caching. [Jeremy Kemper]
519
520 * connection.select_rows 'sql' returns an array (rows) of arrays (field values). #2329 [Michael Schuerig]
521
522 * Eager loading respects explicit :joins. #9496 [dasil003]
523
524 * Extract Firebird, FrontBase, and OpenBase adapters into gems. #9508, #9509, #9510 [Jeremy Kemper]
525
526 * RubyGem database adapters: expects a gem named activerecord-<database>-adapter with active_record/connection_adapters/<database>_adapter.rb in its load path. [Jeremy Kemper]
527
528 * Fixed that altering join tables in migrations would fail w/ sqlite3 #7453 [TimoMihaljov/brandon]
529
530 * Fix association writer with :dependent => :nullify. #7314 [Jonathan Viney]
531
532 * OpenBase: update for new lib and latest Rails. Support migrations. #8748 [dcsesq]
533
534 * Moved acts_as_tree into a plugin of the same name on the official Rails svn. #9514 [Pratik Naik]
535
536 * Moved acts_as_nested_set into a plugin of the same name on the official Rails svn. #9516 [Josh Peek]
537
538 * Moved acts_as_list into a plugin of the same name on the official Rails svn. [Josh Peek]
539
540 * Explicitly require active_record/query_cache before using it. [Jeremy Kemper]
541
542 * Fix bug where unserializing an attribute attempts to modify a frozen @attributes hash for a deleted record. [Rick Olson, marclove]
543
544 * Performance: absorb instantiate and initialize_with_callbacks into the Base methods. [Jeremy Kemper]
545
546 * Fixed that eager loading queries and with_scope should respect the :group option [David Heinemeier Hansson]
547
548 * Improve performance and functionality of the postgresql adapter. Closes #8049 [roderickvd]
549
550 For more information see: http://dev.rubyonrails.org/ticket/8049
551
552 * Don't clobber includes passed to has_many.count [Jack Danger Canty]
553
554 * Make sure has_many uses :include when counting [Jack Danger Canty]
555
556 * Change the implementation of ActiveRecord's attribute reader and writer methods [Michael Koziarski]
557 - Generate Reader and Writer methods which cache attribute values in hashes. This is to avoid repeatedly parsing the same date or integer columns.
558 - Change exception raised when users use find with :select then try to access a skipped column. Plugins could override missing_attribute() to lazily load the columns.
559 - Move method definition to the class, instead of the instance
560 - Always generate the readers, writers and predicate methods.
561
562 * Perform a deep #dup on query cache results so that modifying activerecord attributes does not modify the cached attributes. [Rick Olson]
563
564 # Ensure that has_many :through associations use a count query instead of loading the target when #size is called. Closes #8800 [Pratik Naik]
565
566 * Added :unless clause to validations #8003 [monki]. Example:
567
568 def using_open_id?
569 !identity_url.blank?
570 end
571
572 validates_presence_of :identity_url, :if => using_open_id?
573 validates_presence_of :username, :unless => using_open_id?
574 validates_presence_of :password, :unless => using_open_id?
575
576 * Fix #count on a has_many :through association so that it recognizes the :uniq option. Closes #8801 [Pratik Naik]
577
578 * Fix and properly document/test count(column_name) usage. Closes #8999 [Pratik Naik]
579
580 * Remove deprecated count(conditions=nil, joins=nil) usage. Closes #8993 [Pratik Naik]
581
582 * Change belongs_to so that the foreign_key assumption is taken from the association name, not the class name. Closes #8992 [Josh Susser]
583
584 OLD
585 belongs_to :visitor, :class_name => 'User' # => inferred foreign_key is user_id
586
587 NEW
588 belongs_to :visitor, :class_name => 'User' # => inferred foreign_key is visitor_id
589
590 * Remove spurious tests from deprecated_associations_test, most of these aren't deprecated, and are duplicated in associations_test. Closes #8987 [Pratik Naik]
591
592 * Make create! on a has_many :through association return the association object. Not the collection. Closes #8786 [Pratik Naik]
593
594 * Move from select * to select tablename.* to avoid clobbering IDs. Closes #8889 [dasil003]
595
596 * Don't call unsupported methods on associated objects when using :include, :method with to_xml #7307, [Manfred Stienstra, jwilger]
597
598 * Define collection singular ids method for has_many :through associations. #8763 [Pratik Naik]
599
600 * Array attribute conditions work with proxied association collections. #8318 [Kamal Fariz Mahyuddin, theamazingrando]
601
602 * Fix polymorphic has_one associations declared in an abstract class. #8638 [Pratik Naik, Dax Huiberts]
603
604 * Fixed validates_associated should not stop on the first error. #4276 [mrj, Manfred Stienstra, Josh Peek]
605
606 * Rollback if commit raises an exception. #8642 [kik, Jeremy Kemper]
607
608 * Update tests' use of fixtures for the new collections api. #8726 [Kamal Fariz Mahyuddin]
609
610 * Save associated records only if the association is already loaded. #8713 [Blaine]
611
612 * MySQL: fix show_variable. #8448 [matt, Jeremy Kemper]
613
614 * Fixtures: correctly delete and insert fixtures in a single transaction. #8553 [Michael Schuerig]
615
616 * Fixtures: people(:technomancy, :josh) returns both fixtures. #7880 [technomancy, Josh Peek]
617
618 * Calculations support non-numeric foreign keys. #8154 [Kamal Fariz Mahyuddin]
619
620 * with_scope is protected. #8524 [Josh Peek]
621
622 * Quickref for association methods. #7723 [marclove, Mindsweeper]
623
624 * Calculations: return nil average instead of 0 when there are no rows to average. #8298 [davidw]
625
626 * acts_as_nested_set: direct_children is sorted correctly. #4761 [Josh Peek, rails@33lc0.net]
627
628 * Raise an exception if both attr_protected and attr_accessible are declared. #8507 [stellsmi]
629
630 * SQLite, MySQL, PostgreSQL, Oracle: quote column names in column migration SQL statements. #8466 [marclove, lorenjohnson]
631
632 * Allow nil serialized attributes with a set class constraint. #7293 [sandofsky]
633
634 * Oracle: support binary fixtures. #7987 [Michael Schoen]
635
636 * Fixtures: pull fixture insertion into the database adapters. #7987 [Michael Schoen]
637
638 * Announce migration versions as they're performed. [Jeremy Kemper]
639
640 * find gracefully copes with blank :conditions. #7599 [Dan Manges, johnnyb]
641
642 * validates_numericality_of takes :greater_than, :greater_than_or_equal_to, :equal_to, :less_than, :less_than_or_equal_to, :odd, and :even options. #3952 [Bob Silva, Dan Kubb, Josh Peek]
643
644 * MySQL: create_database takes :charset and :collation options. Charset defaults to utf8. #8448 [matt]
645
646 * Find with a list of ids supports limit/offset. #8437 [hrudududu]
647
648 * Optimistic locking: revert the lock version when an update fails. #7840 [plang]
649
650 * Migrations: add_column supports custom column types. #7742 [jsgarvin, Theory]
651
652 * Load database adapters on demand. Eliminates config.connection_adapters and RAILS_CONNECTION_ADAPTERS. Add your lib directory to the $LOAD_PATH and put your custom adapter in lib/active_record/connection_adapters/adaptername_adapter.rb. This way you can provide custom adapters as plugins or gems without modifying Rails. [Jeremy Kemper]
653
654 * Ensure that associations with :dependent => :delete_all respect :conditions option. Closes #8034 [Jack Danger Canty, Josh Peek, Rick Olson]
655
656 * belongs_to assignment creates a new proxy rather than modifying its target in-place. #8412 [mmangino@elevatedrails.com]
657
658 * Fix column type detection while loading fixtures. Closes #7987 [roderickvd]
659
660 * Document deep eager includes. #6267 [Josh Susser, Dan Manges]
661
662 * Document warning that associations names shouldn't be reserved words. #4378 [murphy@cYcnus.de, Josh Susser]
663
664 * Sanitize Base#inspect. #8392, #8623 [Nik Wakelin, jnoon]
665
666 * Replace the transaction {|transaction|..} semantics with a new Exception ActiveRecord::Rollback. [Michael Koziarski]
667
668 * Oracle: extract column length for CHAR also. #7866 [ymendel]
669
670 * Document :allow_nil option for validates_acceptance_of since it defaults to true. [tzaharia]
671
672 * Update documentation for :dependent declaration so that it explicitly uses the non-deprecated API. [Jack Danger Canty]
673
674 * Add documentation caveat about when to use count_by_sql. [fearoffish]
675
676 * Enhance documentation for increment_counter and decrement_counter. [fearoffish]
677
678 * Provide brief introduction to what optimistic locking is. [fearoffish]
679
680 * Add documentation for :encoding option to mysql adapter. [marclove]
681
682 * Added short-hand declaration style to migrations (inspiration from Sexy Migrations, http://errtheblog.com/post/2381) [David Heinemeier Hansson]. Example:
683
684 create_table "products" do |t|
685 t.column "shop_id", :integer
686 t.column "creator_id", :integer
687 t.column "name", :string, :default => "Untitled"
688 t.column "value", :string, :default => "Untitled"
689 t.column "created_at", :datetime
690 t.column "updated_at", :datetime
691 end
692
693 ...can now be written as:
694
695 create_table :products do |t|
696 t.integer :shop_id, :creator_id
697 t.string :name, :value, :default => "Untitled"
698 t.timestamps
699 end
700
701 * Use association name for the wrapper element when using .to_xml. Previous behavior lead to non-deterministic situations with STI and polymorphic associations. [Michael Koziarski, jstrachan]
702
703 * Improve performance of calling .create on has_many :through associations. [evan]
704
705 * Improved cloning performance by relying less on exception raising #8159 [Blaine]
706
707 * Added ActiveRecord::Base.inspect to return a column-view like #<Post id:integer, title:string, body:text> [David Heinemeier Hansson]
708
709 * Added yielding of Builder instance for ActiveRecord::Base#to_xml calls [David Heinemeier Hansson]
710
711 * Small additions and fixes for ActiveRecord documentation. Closes #7342 [Jeremy McAnally]
712
713 * Add helpful debugging info to the ActiveRecord::StatementInvalid exception in ActiveRecord::ConnectionAdapters::SqliteAdapter#table_structure. Closes #7925. [court3nay]
714
715 * SQLite: binary escaping works with $KCODE='u'. #7862 [tsuka]
716
717 * Base#to_xml supports serialized attributes. #7502 [jonathan]
718
719 * Base.update_all :order and :limit options. Useful for MySQL updates that must be ordered to avoid violating unique constraints. [Jeremy Kemper]
720
721 * Remove deprecated object transactions. People relying on this functionality should install the object_transactions plugin at http://code.bitsweat.net/svn/object_transactions. Closes #5637 [Michael Koziarski, Jeremy Kemper]
722
723 * PostgreSQL: remove DateTime -> Time downcast. Warning: do not enable translate_results for the C bindings if you have timestamps outside Time's domain. [Jeremy Kemper]
724
725 * find_or_create_by_* takes a hash so you can create with more attributes than are in the method name. For example, Person.find_or_create_by_name(:name => 'Henry', :comments => 'Hi new user!') is equivalent to Person.find_by_name('Henry') || Person.create(:name => 'Henry', :comments => 'Hi new user!'). #7368 [Josh Susser]
726
727 * Make sure with_scope takes both :select and :joins into account when setting :readonly. Allows you to save records you retrieve using method_missing on a has_many :through associations. [Michael Koziarski]
728
729 * Allow a polymorphic :source for has_many :through associations. Closes #7143 [protocool]
730
731 * Consistent public/protected/private visibility for chained methods. #7813 [Dan Manges]
732
733 * Oracle: fix quoted primary keys and datetime overflow. #7798 [Michael Schoen]
734
735 * Consistently quote primary key column names. #7763 [toolmantim]
736
737 * Fixtures: fix YAML ordered map support. #2665 [Manuel Holtgrewe, nfbuckley]
738
739 * DateTimes assume the default timezone. #7764 [Geoff Buesing]
740
741 * Sybase: hide timestamp columns since they're inherently read-only. #7716 [Mike Joyce]
742
743 * Oracle: overflow Time to DateTime. #7718 [Michael Schoen]
744
745 * PostgreSQL: don't use async_exec and async_query with postgres-pr. #7727, #7762 [flowdelic, toolmantim]
746
747 * Fix has_many :through << with custom foreign keys. #6466, #7153 [naffis, Rich Collins]
748
749 * Test DateTime native type in migrations, including an edge case with dates
750 during calendar reform. #7649, #7724 [fedot, Geoff Buesing]
751
752 * SQLServer: correctly schema-dump tables with no indexes or descending indexes. #7333, #7703 [Jakob Skjerning, Tom Ward]
753
754 * SQLServer: recognize real column type as Ruby float. #7057 [sethladd, Tom Ward]
755
756 * Added fixtures :all as a way of loading all fixtures in the fixture directory at once #7214 [Manfred Stienstra]
757
758 * Added database connection as a yield parameter to ActiveRecord::Base.transaction so you can manually rollback [David Heinemeier Hansson]. Example:
759
760 transaction do |transaction|
761 david.withdrawal(100)
762 mary.deposit(100)
763 transaction.rollback! # rolls back the transaction that was otherwise going to be successful
764 end
765
766 * Made increment_counter/decrement_counter play nicely with optimistic locking, and added a more general update_counters method [Jamis Buck]
767
768 * Reworked David's query cache to be available as Model.cache {...}. For the duration of the block no select query should be run more then once. Any inserts/deletes/executes will flush the whole cache however [Tobias Lütke]
769 Task.cache { Task.find(1); Task.find(1) } #=> 1 query
770
771 * When dealing with SQLite3, use the table_info pragma helper, so that the bindings can do some translation for when sqlite3 breaks incompatibly between point releases. [Jamis Buck]
772
773 * Oracle: fix lob and text default handling. #7344 [gfriedrich, Michael Schoen]
774
775 * SQLServer: don't choke on strings containing 'null'. #7083 [Jakob Skjerning]
776
777 * MySQL: blob and text columns may not have defaults in 5.x. Update fixtures schema for strict mode. #6695 [Dan Kubb]
778
779 * update_all can take a Hash argument. sanitize_sql splits into two methods for conditions and assignment since NULL values and delimiters are handled differently. #6583, #7365 [sandofsky, Assaf]
780
781 * MySQL: SET SQL_AUTO_IS_NULL=0 so 'where id is null' doesn't select the last inserted id. #6778 [Jonathan Viney, timc]
782
783 * Use Date#to_s(:db) for quoted dates. #7411 [Michael Schoen]
784
785 * Don't create instance writer methods for class attributes. Closes #7401 [Rick Olson]
786
787 * Docs: validations examples. #7343 [zackchandler]
788
789 * Add missing tests ensuring callbacks work with class inheritance. Closes #7339 [sandofsky]
790
791 * Fixtures use the table name and connection from set_fixture_class. #7330 [Anthony Eden]
792
793 * Remove useless code in #attribute_present? since 0 != blank?. Closes #7249 [Josh Susser]
794
795 * Fix minor doc typos. Closes #7157 [Josh Susser]
796
797 * Fix incorrect usage of #classify when creating the eager loading join statement. Closes #7044 [Josh Susser]
798
799 * SQLServer: quote table name in indexes query. #2928 [keithm@infused.org]
800
801 * Subclasses of an abstract class work with single-table inheritance. #5704, #7284 [BertG, nick+rails@ag.arizona.edu]
802
803 * Make sure sqlite3 driver closes open connections on disconnect [Rob Rasmussen]
804
805 * [DOC] clear up some ambiguity with the way has_and_belongs_to_many creates the default join table name. #7072 [Jeremy McAnally]
806
807 * change_column accepts :default => nil. Skip column options for primary keys. #6956, #7048 [Dan Manges, Jeremy Kemper]
808
809 * MySQL, PostgreSQL: change_column_default quotes the default value and doesn't lose column type information. #3987, #6664 [Jonathan Viney, Manfred Stienstra, altano@bigfoot.com]
810
811 * Oracle: create_table takes a :sequence_name option to override the 'tablename_seq' default. #7000 [Michael Schoen]
812
813 * MySQL: retain SSL settings on reconnect. #6976 [randyv2]
814
815 * Apply scoping during initialize instead of create. Fixes setting of foreign key when using find_or_initialize_by with scoping. [Cody Fauser]
816
817 * SQLServer: handle [quoted] table names. #6635 [rrich]
818
819 * acts_as_nested_set works with single-table inheritance. #6030 [Josh Susser]
820
821 * PostgreSQL, Oracle: correctly perform eager finds with :limit and :order. #4668, #7021 [eventualbuddha, Michael Schoen]
822
823 * Pass a range in :conditions to use the SQL BETWEEN operator. #6974 [Dan Manges]
824 Student.find(:all, :conditions => { :grade => 9..12 })
825
826 * Fix the Oracle adapter for serialized attributes stored in CLOBs. Closes #6825 [mschoen, tdfowler]
827
828 * [DOCS] Apply more documentation for ActiveRecord Reflection. Closes #4055 [Robby Russell]
829
830 * [DOCS] Document :allow_nil option of #validate_uniqueness_of. Closes #3143 [Caio Chassot]
831
832 * Bring the sybase adapter up to scratch for 1.2 release. [jsheets]
833
834 * Rollback new_record? and id when an exception is raised in a save callback. #6910 [Ben Curren, outerim]
835
836 * Pushing a record on an association collection doesn't unnecessarily load all the associated records. [Obie Fernandez, Jeremy Kemper]
837
838 * Oracle: fix connection reset failure. #6846 [leonlleslie]
839
840 * Subclass instantiation doesn't try to explicitly require the corresponding subclass. #6840 [leei, Jeremy Kemper]
841
842 * fix faulty inheritance tests and that eager loading grabs the wrong inheritance column when the class of your association is an STI subclass. Closes #6859 [protocool]
843
844 * Consolidated different create and create! versions to call through to the base class with scope. This fixes inconsistencies, especially related to protected attribtues. Closes #5847 [Alexander Dymo, Tobias Lütke]
845
846 * find supports :lock with :include. Check whether your database allows SELECT ... FOR UPDATE with outer joins before using. #6764 [vitaly, Jeremy Kemper]
847
848 * Add AssociationCollection#create! to be consistent with AssociationCollection#create when dealing with a foreign key that is a protected attribute [Cody Fauser]
849
850 * Added counter optimization for AssociationCollection#any? so person.friends.any? won't actually load the full association if we have the count in a cheaper form [David Heinemeier Hansson]
851
852 * Change fixture_path to a class inheritable accessor allowing test cases to have their own custom set of fixtures. #6672 [Zach Dennis]
853
854 * Quote ActiveSupport::Multibyte::Chars. #6653 [Julian Tarkhanov]
855
856 * Simplify query_attribute by typecasting the attribute value and checking whether it's nil, false, zero or blank. #6659 [Jonathan Viney]
857
858 * validates_numericality_of uses \A \Z to ensure the entire string matches rather than ^ $ which may match one valid line of a multiline string. #5716 [Andreas Schwarz]
859
860 * Run validations in the order they were declared. #6657 [obrie]
861
862 * MySQL: detect when a NOT NULL column without a default value is misreported as default ''. Can't detect for string, text, and binary columns since '' is a legitimate default. #6156 [simon@redhillconsulting.com.au, obrie, Jonathan Viney, Jeremy Kemper]
863
864 * Simplify association proxy implementation by factoring construct_scope out of method_missing. #6643 [martin]
865
866 * Oracle: automatically detect the primary key. #6594 [vesaria, Michael Schoen]
867
868 * Oracle: to increase performance, prefetch 100 rows and enable similar cursor sharing. Both are configurable in database.yml. #6607 [philbogle@gmail.com, ray.fortna@jobster.com, Michael Schoen]
869
870 * Don't inspect unloaded associations. #2905 [lmarlow]
871
872 * SQLite: use AUTOINCREMENT primary key in >= 3.1.0. #6588, #6616 [careo, lukfugl]
873
874 * Cache inheritance_column. #6592 [Stefan Kaes]
875
876 * Firebird: decimal/numeric support. #6408 [macrnic]
877
878 * make add_order a tad faster. #6567 [Stefan Kaes]
879
880 * Find with :include respects scoped :order. #5850
881
882 * Support nil and Array in :conditions => { attr => value } hashes. #6548 [Assaf, Jeremy Kemper]
883 find(:all, :conditions => { :topic_id => [1, 2, 3], :last_read => nil }
884
885 * Consistently use LOWER() for uniqueness validations (rather than mixing with UPPER()) so the database can always use a functional index on the lowercased column. #6495 [Si]
886
887 * SQLite: fix calculations workaround, remove count(distinct) query rewrite, cleanup test connection scripts. [Jeremy Kemper]
888
889 * SQLite: count(distinct) queries supported in >= 3.2.6. #6544 [Bob Silva]
890
891 * Dynamically generate reader methods for serialized attributes. #6362 [Stefan Kaes]
892
893 * Deprecation: object transactions warning. [Jeremy Kemper]
894
895 * has_one :dependent => :nullify ignores nil associates. #4848, #6528 [bellis@deepthought.org, janovetz, Jeremy Kemper]
896
897 * Oracle: resolve test failures, use prefetched primary key for inserts, check for null defaults, fix limited id selection for eager loading. Factor out some common methods from all adapters. #6515 [Michael Schoen]
898
899 * Make add_column use the options hash with the Sqlite Adapter. Closes #6464 [obrie]
900
901 * Document other options available to migration's add_column. #6419 [grg]
902
903 * MySQL: all_hashes compatibility with old MysqlRes class. #6429, #6601 [Jeremy Kemper]
904
905 * Fix has_many :through to add the appropriate conditions when going through an association using STI. Closes #5783. [Jonathan Viney]
906
907 * fix select_limited_ids_list issues in postgresql, retain current behavior in other adapters [Rick Olson]
908
909 * Restore eager condition interpolation, document it's differences [Rick Olson]
910
911 * Don't rollback in teardown unless a transaction was started. Don't start a transaction in create_fixtures if a transaction is started. #6282 [Jacob Fugal, Jeremy Kemper]
912
913 * Add #delete support to has_many :through associations. Closes #6049 [Martin Landers]
914
915 * Reverted old select_limited_ids_list postgresql fix that caused issues in mysql. Closes #5851 [Rick Olson]
916
917 * Removes the ability for eager loaded conditions to be interpolated, since there is no model instance to use as a context for interpolation. #5553 [turnip@turnipspatch.com]
918
919 * Added timeout option to SQLite3 configurations to deal more gracefully with SQLite3::BusyException, now the connection can instead retry for x seconds to see if the db clears up before throwing that exception #6126 [wreese@gmail.com]
920
921 * Added update_attributes! which uses save! to raise an exception if a validation error prevents saving #6192 [jonathan]
922
923 * Deprecated add_on_boundary_breaking (use validates_length_of instead) #6292 [Bob Silva]
924
925 * The has_many create method works with polymorphic associations. #6361 [Dan Peterson]
926
927 * MySQL: introduce Mysql::Result#all_hashes to support further optimization. #5581 [Stefan Kaes]
928
929 * save! shouldn't validate twice. #6324 [maiha, Bob Silva]
930
931 * Association collections have an _ids reader method to match the existing writer for collection_select convenience (e.g. employee.task_ids). The writer method skips blank ids so you can safely do @employee.task_ids = params[:tasks] without checking every time for an empty list or blank values. #1887, #5780 [Michael Schuerig]
932
933 * Add an attribute reader method for ActiveRecord::Base.observers [Rick Olson]
934
935 * Deprecation: count class method should be called with an options hash rather than two args for conditions and joins. #6287 [Bob Silva]
936
937 * has_one associations with a nil target may be safely marshaled. #6279 [norbauer, Jeremy Kemper]
938
939 * Duplicate the hash provided to AR::Base#to_xml to prevent unexpected side effects [Michael Koziarski]
940
941 * Add a :namespace option to AR::Base#to_xml [Michael Koziarski]
942
943 * Deprecation tests. Remove warnings for dynamic finders and for the foo_count method if it's also an attribute. [Jeremy Kemper]
944
945 * Mock Time.now for more accurate Touch mixin tests. #6213 [Dan Peterson]
946
947 * Improve yaml fixtures error reporting. #6205 [Bruce Williams]
948
949 * Rename AR::Base#quote so people can use that name in their models. #3628 [Michael Koziarski]
950
951 * Add deprecation warning for inferred foreign key. #6029 [Josh Susser]
952
953 * Fixed the Ruby/MySQL adapter we ship with Active Record to work with the new authentication handshake that was introduced in MySQL 4.1, along with the other protocol changes made at that time #5723 [jimw@mysql.com]
954
955 * Deprecation: use :dependent => :delete_all rather than :exclusively_dependent => true. #6024 [Josh Susser]
956
957 * Document validates_presences_of behavior with booleans: you probably want validates_inclusion_of :attr, :in => [true, false]. #2253 [Bob Silva]
958
959 * Optimistic locking: gracefully handle nil versions, treat as zero. #5908 [Tom Ward]
960
961 * to_xml: the :methods option works on arrays of records. #5845 [Josh Starcher]
962
963 * Deprecation: update docs. #5998 [Jakob Skjerning, Kevin Clark]
964
965 * Add some XmlSerialization tests for ActiveRecord [Rick Olson]
966
967 * has_many :through conditions are sanitized by the associating class. #5971 [martin.emde@gmail.com]
968
969 * Tighten rescue clauses. #5985 [james@grayproductions.net]
970
971 * Fix spurious newlines and spaces in AR::Base#to_xml output [Jamis Buck]
972
973 * has_one supports the :dependent => :delete option which skips the typical callback chain and deletes the associated object directly from the database. #5927 [Chris Mear, Jonathan Viney]
974
975 * Nested subclasses are not prefixed with the parent class' table_name since they should always use the base class' table_name. #5911 [Jonathan Viney]
976
977 * SQLServer: work around bug where some unambiguous date formats are not correctly identified if the session language is set to german. #5894 [Tom Ward, kruth@bfpi]
978
979 * SQLServer: fix eager association test. #5901 [Tom Ward]
980
981 * Clashing type columns due to a sloppy join shouldn't wreck single-table inheritance. #5838 [Kevin Clark]
982
983 * Fixtures: correct escaping of \n and \r. #5859 [evgeny.zislis@gmail.com]
984
985 * Migrations: gracefully handle missing migration files. #5857 [eli.gordon@gmail.com]
986
987 * MySQL: update test schema for MySQL 5 strict mode. #5861 [Tom Ward]
988
989 * to_xml: correct naming of included associations. #5831 [Josh Starcher]
990
991 * Pushing a record onto a has_many :through sets the association's foreign key to the associate's primary key and adds it to the correct association. #5815, #5829 [Josh Susser]
992
993 * Add records to has_many :through using <<, push, and concat by creating the association record. Raise if base or associate are new records since both ids are required to create the association. #build raises since you can't associate an unsaved record. #create! takes an attributes hash and creates the associated record and its association in a transaction. [Jeremy Kemper]
994
995 # Create a tagging to associate the post and tag.
996 post.tags << Tag.find_by_name('old')
997 post.tags.create! :name => 'general'
998
999 # Would have been:
1000 post.taggings.create!(:tag => Tag.find_by_name('finally')
1001 transaction do
1002 post.taggings.create!(:tag => Tag.create!(:name => 'general'))
1003 end
1004
1005 * Cache nil results for :included has_one associations also. #5787 [Michael Schoen]
1006
1007 * Fixed a bug which would cause .save to fail after trying to access a empty has_one association on a unsaved record. [Tobias Lütke]
1008
1009 * Nested classes are given table names prefixed by the singular form of the parent's table name. [Jeremy Kemper]
1010 Example: Invoice::Lineitem is given table name invoice_lineitems
1011
1012 * Migrations: uniquely name multicolumn indexes so you don't have to. [Jeremy Kemper]
1013 # people_active_last_name_index, people_active_deactivated_at_index
1014 add_index :people, [:active, :last_name]
1015 add_index :people, [:active, :deactivated_at]
1016 remove_index :people, [:active, :last_name]
1017 remove_index :people, [:active, :deactivated_at]
1018
1019 WARNING: backward-incompatibility. Multicolumn indexes created before this
1020 revision were named using the first column name only. Now they're uniquely
1021 named using all indexed columns.
1022
1023 To remove an old multicolumn index, remove_index :table_name, :first_column
1024
1025 * Fix for deep includes on the same association. [richcollins@gmail.com]
1026
1027 * Tweak fixtures so they don't try to use a non-ActiveRecord class. [Kevin Clark]
1028
1029 * Remove ActiveRecord::Base.reset since Dispatcher doesn't use it anymore. [Rick Olson]
1030
1031 * Document find's :from option. Closes #5762. [andrew@redlinesoftware.com]
1032
1033 * PostgreSQL: autodetected sequences work correctly with multiple schemas. Rely on the schema search_path instead of explicitly qualifying the sequence name with its schema. #5280 [guy.naor@famundo.com]
1034
1035 * Replace Reloadable with Reloadable::Deprecated. [Nicholas Seckar]
1036
1037 * Cache nil results for has_one associations so multiple calls don't call the database. Closes #5757. [Michael Schoen]
1038
1039 * Add documentation for how to disable timestamps on a per model basis. Closes #5684. [matt@mattmargolis.net Marcel Molina Jr.]
1040
1041 * Don't save has_one associations unnecessarily. #5735 [Jonathan Viney]
1042
1043 * Refactor ActiveRecord::Base.reset_subclasses to #reset, and add global observer resetting. [Rick Olson]
1044
1045 * Formally deprecate the deprecated finders. [Michael Koziarski]
1046
1047 * Formally deprecate rich associations. [Michael Koziarski]
1048
1049 * Fixed that default timezones for new / initialize should uphold utc setting #5709 [daniluk@yahoo.com]
1050
1051 * Fix announcement of very long migration names. #5722 [blake@near-time.com]
1052
1053 * The exists? class method should treat a string argument as an id rather than as conditions. #5698 [jeremy@planetargon.com]
1054
1055 * Fixed to_xml with :include misbehaviors when invoked on array of model instances #5690 [alexkwolfe@gmail.com]
1056
1057 * Added support for conditions on Base.exists? #5689 [Josh Peek]. Examples:
1058
1059 assert (Topic.exists?(:author_name => "David"))
1060 assert (Topic.exists?(:author_name => "Mary", :approved => true))
1061 assert (Topic.exists?(["parent_id = ?", 1]))
1062
1063 * Schema dumper quotes date :default values. [Dave Thomas]
1064
1065 * Calculate sum with SQL, not Enumerable on HasManyThrough Associations. [Dan Peterson]
1066
1067 * Factor the attribute#{suffix} methods out of method_missing for easier extension. [Jeremy Kemper]
1068
1069 * Patch sql injection vulnerability when using integer or float columns. [Jamis Buck]
1070
1071 * Allow #count through a has_many association to accept :include. [Dan Peterson]
1072
1073 * create_table rdoc: suggest :id => false for habtm join tables. [Zed Shaw]
1074
1075 * PostgreSQL: return array fields as strings. #4664 [Robby Russell]
1076
1077 * SQLServer: added tests to ensure all database statements are closed, refactored identity_insert management code to use blocks, removed update/delete rowcount code out of execute and into update/delete, changed insert to go through execute method, removed unused quoting methods, disabled pessimistic locking tests as feature is currently unsupported, fixed RakeFile to load sqlserver specific tests whether running in ado or odbc mode, fixed support for recently added decimal types, added support for limits on integer types. #5670 [Tom Ward]
1078
1079 * SQLServer: fix db:schema:dump case-sensitivity. #4684 [Will Rogers]
1080
1081 * Oracle: BigDecimal support. #5667 [Michael Schoen]
1082
1083 * Numeric and decimal columns map to BigDecimal instead of Float. Those with scale 0 map to Integer. #5454 [robbat2@gentoo.org, work@ashleymoran.me.uk]
1084
1085 * Firebird migrations support. #5337 [Ken Kunz <kennethkunz@gmail.com>]
1086
1087 * PostgreSQL: create/drop as postgres user. #4790 [mail@matthewpainter.co.uk, mlaster@metavillage.com]
1088
1089 * Update callbacks documentation. #3970 [Robby Russell <robby@planetargon.com>]
1090
1091 * PostgreSQL: correctly quote the ' in pk_and_sequence_for. #5462 [tietew@tietew.net]
1092
1093 * PostgreSQL: correctly quote microseconds in timestamps. #5641 [rick@rickbradley.com]
1094
1095 * Clearer has_one/belongs_to model names (account has_one :user). #5632 [matt@mattmargolis.net]
1096
1097 * Oracle: use nonblocking queries if allow_concurrency is set, fix pessimistic locking, don't guess date vs. time by default (set OracleAdapter.emulate_dates = true for the old behavior), adapter cleanup. #5635 [Michael Schoen]
1098
1099 * Fixed a few Oracle issues: Allows Oracle's odd date handling to still work consistently within #to_xml, Passes test that hardcode insert statement by dropping the :id column, Updated RUNNING_UNIT_TESTS with Oracle instructions, Corrects method signature for #exec #5294 [Michael Schoen]
1100
1101 * Added :group to available options for finds done on associations #5516 [mike@michaeldewey.org]
1102
1103 * Minor tweak to improve performance of ActiveRecord::Base#to_param.
1104
1105 * Observers also watch subclasses created after they are declared. #5535 [daniels@pronto.com.au]
1106
1107 * Removed deprecated timestamps_gmt class methods. [Jeremy Kemper]
1108
1109 * rake build_mysql_database grants permissions to rails@localhost. #5501 [brianegge@yahoo.com]
1110
1111 * PostgreSQL: support microsecond time resolution. #5492 [alex@msgpad.com]
1112
1113 * Add AssociationCollection#sum since the method_missing invokation has been shadowed by Enumerable#sum.
1114
1115 * Added find_or_initialize_by_X which works like find_or_create_by_X but doesn't save the newly instantiated record. [Sam Stephenson]
1116
1117 * Row locking. Provide a locking clause with the :lock finder option or true for the default "FOR UPDATE". Use the #lock! method to obtain a row lock on a single record (reloads the record with :lock => true). [Shugo Maeda]
1118 # Obtain an exclusive lock on person 1 so we can safely increment visits.
1119 Person.transaction do
1120 # select * from people where id=1 for update
1121 person = Person.find(1, :lock => true)
1122 person.visits += 1
1123 person.save!
1124 end
1125
1126 * PostgreSQL: introduce allow_concurrency option which determines whether to use blocking or asynchronous #execute. Adapters with blocking #execute will deadlock Ruby threads. The default value is ActiveRecord::Base.allow_concurrency. [Jeremy Kemper]
1127
1128 * Use a per-thread (rather than global) transaction mutex so you may execute concurrent transactions on separate connections. [Jeremy Kemper]
1129
1130 * Change AR::Base#to_param to return a String instead of a Fixnum. Closes #5320. [Nicholas Seckar]
1131
1132 * Use explicit delegation instead of method aliasing for AR::Base.to_param -> AR::Base.id. #5299 (skaes@web.de)
1133
1134 * Refactored ActiveRecord::Base.to_xml to become a delegate for XmlSerializer, which restores sanity to the mega method. This refactoring also reinstates the opinions that type="string" is redundant and ugly and nil-differentiation is not a concern of serialization [David Heinemeier Hansson]
1135
1136 * Added simple hash conditions to find that'll just convert hash to an AND-based condition string #5143 [Hampton Catlin]. Example:
1137
1138 Person.find(:all, :conditions => { :last_name => "Catlin", :status => 1 }, :limit => 2)
1139
1140 ...is the same as:
1141
1142 Person.find(:all, :conditions => [ "last_name = ? and status = ?", "Catlin", 1 ], :limit => 2)
1143
1144 This makes it easier to pass in the options from a form or otherwise outside.
1145
1146
1147 * Fixed issues with BLOB limits, charsets, and booleans for Firebird #5194, #5191, #5189 [kennethkunz@gmail.com]
1148
1149 * Fixed usage of :limit and with_scope when the association in scope is a 1:m #5208 [alex@purefiction.net]
1150
1151 * Fixed migration trouble with SQLite when NOT NULL is used in the new definition #5215 [greg@lapcominc.com]
1152
1153 * Fixed problems with eager loading and counting on SQL Server #5212 [kajism@yahoo.com]
1154
1155 * Fixed that count distinct should use the selected column even when using :include #5251 [anna@wota.jp]
1156
1157 * Fixed that :includes merged from with_scope won't cause the same association to be loaded more than once if repetition occurs in the clauses #5253 [alex@purefiction.net]
1158
1159 * Allow models to override to_xml. #4989 [Blair Zajac <blair@orcaware.com>]
1160
1161 * PostgreSQL: don't ignore port when host is nil since it's often used to label the domain socket. #5247 [shimbo@is.naist.jp]
1162
1163 * Records and arrays of records are bound as quoted ids. [Jeremy Kemper]
1164 Foo.find(:all, :conditions => ['bar_id IN (?)', bars])
1165 Foo.find(:first, :conditions => ['bar_id = ?', bar])
1166
1167 * Fixed that Base.find :all, :conditions => [ "id IN (?)", collection ] would fail if collection was empty [David Heinemeier Hansson]
1168
1169 * Add a list of regexes assert_queries skips in the ActiveRecord test suite. [Rick Olson]
1170
1171 * Fix the has_and_belongs_to_many #create doesn't populate the join for new records. Closes #3692 [Josh Susser]
1172
1173 * Provide Association Extensions access to the instance that the association is being accessed from.
1174 Closes #4433 [Josh Susser]
1175
1176 * Update OpenBase adaterp's maintainer's email address. Closes #5176. [Derrick Spell]
1177
1178 * Add a quick note about :select and eagerly included associations. [Rick Olson]
1179
1180 * Add docs for the :as option in has_one associations. Closes #5144 [cdcarter@gmail.com]
1181
1182 * Fixed that has_many collections shouldn't load the entire association to do build or create [David Heinemeier Hansson]
1183
1184 * Added :allow_nil option for aggregations #5091 [Ian White]
1185
1186 * Fix Oracle boolean support and tests. Closes #5139. [Michael Schoen]
1187
1188 * create! no longer blows up when no attributes are passed and a :create scope is in effect (e.g. foo.bars.create! failed whereas foo.bars.create!({}) didn't.) [Jeremy Kemper]
1189
1190 * Call Inflector#demodulize on the class name when eagerly including an STI model. Closes #5077 [info@loobmedia.com]
1191
1192 * Preserve MySQL boolean column defaults when changing a column in a migration. Closes #5015. [pdcawley@bofh.org.uk]
1193
1194 * PostgreSQL: migrations support :limit with :integer columns by mapping limit < 4 to smallint, > 4 to bigint, and anything else to integer. #2900 [keegan@thebasement.org]
1195
1196 * Dates and times interpret empty strings as nil rather than 2000-01-01. #4830 [kajism@yahoo.com]
1197
1198 * Allow :uniq => true with has_many :through associations. [Jeremy Kemper]
1199
1200 * Ensure that StringIO is always available for the Schema dumper. [Marcel Molina Jr.]
1201
1202 * Allow AR::Base#to_xml to include methods too. Closes #4921. [johan@textdrive.com]
1203
1204 * Replace superfluous name_to_class_name variant with camelize. [Marcel Molina Jr.]
1205
1206 * Replace alias method chaining with Module#alias_method_chain. [Marcel Molina Jr.]
1207
1208 * Replace Ruby's deprecated append_features in favor of included. [Marcel Molina Jr.]
1209
1210 * Remove duplicate fixture entry in comments.yml. Closes #4923. [Blair Zajac <blair@orcaware.com>]
1211
1212 * Update FrontBase adapter to check binding version. Closes #4920. [mlaster@metavillage.com]
1213
1214 * New Frontbase connections don't start in auto-commit mode. Closes #4922. [mlaster@metavillage.com]
1215
1216 * When grouping, use the appropriate option key. [Marcel Molina Jr.]
1217
1218 * Only modify the sequence name in the FrontBase adapter if the FrontBase adapter is actually being used. [Marcel Molina Jr.]
1219
1220 * Add support for FrontBase (http://www.frontbase.com/) with a new adapter thanks to the hard work of one Mike Laster. Closes #4093. [mlaster@metavillage.com]
1221
1222 * Add warning about the proper way to validate the presence of a foreign key. Closes #4147. [Francois Beausoleil <francois.beausoleil@gmail.com>]
1223
1224 * Fix syntax error in documentation. Closes #4679. [Mislav Marohnić]
1225
1226 * Add Oracle support for CLOB inserts. Closes #4748. [schoenm@earthlink.net sandra.metz@duke.edu]
1227
1228 * Various fixes for sqlserver_adapter (odbc statement finishing, ado schema dumper, drop index). Closes #4831. [kajism@yahoo.com]
1229
1230 * Add support for :order option to with_scope. Closes #3887. [eric.daspet@survol.net]
1231
1232 * Prettify output of schema_dumper by making things line up. Closes #4241 [Caio Chassot <caio@v2studio.com>]
1233
1234 * Make build_postgresql_databases task make databases owned by the postgres user. Closes #4790. [mlaster@metavillage.com]
1235
1236 * Sybase Adapter type conversion cleanup. Closes #4736. [dev@metacasa.net]
1237
1238 * Fix bug where calculations with long alias names return null. [Rick Olson]
1239
1240 * Raise error when trying to add to a has_many :through association. Use the Join Model instead. [Rick Olson]
1241
1242 @post.tags << @tag # BAD
1243 @post.taggings.create(:tag => @tag) # GOOD
1244
1245 * Allow all calculations to take the :include option, not just COUNT (closes #4840) [Rick Olson]
1246
1247 * Update inconsistent migrations documentation. #4683 [machomagna@gmail.com]
1248
1249 * Add ActiveRecord::Errors#to_xml [Jamis Buck]
1250
1251 * Properly quote index names in migrations (closes #4764) [John Long]
1252
1253 * Fix the HasManyAssociation#count method so it uses the new ActiveRecord::Base#count syntax, while maintaining backwards compatibility. [Rick Olson]
1254
1255 * Ensure that Associations#include_eager_conditions? checks both scoped and explicit conditions [Rick Olson]
1256
1257 * Associations#select_limited_ids_list adds the ORDER BY columns to the SELECT DISTINCT List for postgresql. [Rick Olson]
1258
1259 * DRY up association collection reader method generation. [Marcel Molina Jr.]
1260
1261 * DRY up and tweak style of the validation error object. [Marcel Molina Jr.]
1262
1263 * Add :case_sensitive option to validates_uniqueness_of (closes #3090) [Rick Olson]
1264
1265 class Account < ActiveRecord::Base
1266 validates_uniqueness_of :email, :case_sensitive => false
1267 end
1268
1269 * Allow multiple association extensions with :extend option (closes #4666) [Josh Susser]
1270
1271 class Account < ActiveRecord::Base
1272 has_many :people, :extend => [FindOrCreateByNameExtension, FindRecentExtension]
1273 end
1274
1275 *1.15.3* (March 12th, 2007)
1276
1277 * Allow a polymorphic :source for has_many :through associations. Closes #7143 [protocool]
1278
1279 * Consistently quote primary key column names. #7763 [toolmantim]
1280
1281 * Fixtures: fix YAML ordered map support. #2665 [Manuel Holtgrewe, nfbuckley]
1282
1283 * Fix has_many :through << with custom foreign keys. #6466, #7153 [naffis, Rich Collins]
1284
1285
1286 *1.15.2* (February 5th, 2007)
1287
1288 * Pass a range in :conditions to use the SQL BETWEEN operator. #6974 [Dan Manges]
1289 Student.find(:all, :conditions => { :grade => 9..12 })
1290
1291 * Don't create instance writer methods for class attributes. [Rick Olson]
1292
1293 * When dealing with SQLite3, use the table_info pragma helper, so that the bindings can do some translation for when sqlite3 breaks incompatibly between point releases. [Jamis Buck]
1294
1295 * SQLServer: don't choke on strings containing 'null'. #7083 [Jakob Skjerning]
1296
1297 * Consistently use LOWER() for uniqueness validations (rather than mixing with UPPER()) so the database can always use a functional index on the lowercased column. #6495 [Si]
1298
1299 * MySQL: SET SQL_AUTO_IS_NULL=0 so 'where id is null' doesn't select the last inserted id. #6778 [Jonathan Viney, timc]
1300
1301 * Fixtures use the table name and connection from set_fixture_class. #7330 [Anthony Eden]
1302
1303 * SQLServer: quote table name in indexes query. #2928 [keithm@infused.org]
1304
1305
1306 *1.15.1* (January 17th, 2007)
1307
1308 * Fix nodoc breaking of adapters
1309
1310
1311 *1.15.0* (January 16th, 2007)
1312
1313 * [DOC] clear up some ambiguity with the way has_and_belongs_to_many creates the default join table name. #7072 [Jeremy McAnally]
1314
1315 * change_column accepts :default => nil. Skip column options for primary keys. #6956, #7048 [Dan Manges, Jeremy Kemper]
1316
1317 * MySQL, PostgreSQL: change_column_default quotes the default value and doesn't lose column type information. #3987, #6664 [Jonathan Viney, Manfred Stienstra, altano@bigfoot.com]
1318
1319 * Oracle: create_table takes a :sequence_name option to override the 'tablename_seq' default. #7000 [Michael Schoen]
1320
1321 * MySQL: retain SSL settings on reconnect. #6976 [randyv2]
1322
1323 * SQLServer: handle [quoted] table names. #6635 [rrich]
1324
1325 * acts_as_nested_set works with single-table inheritance. #6030 [Josh Susser]
1326
1327 * PostgreSQL, Oracle: correctly perform eager finds with :limit and :order. #4668, #7021 [eventualbuddha, Michael Schoen]
1328
1329 * Fix the Oracle adapter for serialized attributes stored in CLOBs. Closes #6825 [mschoen, tdfowler]
1330
1331 * [DOCS] Apply more documentation for ActiveRecord Reflection. Closes #4055 [Robby Russell]
1332
1333 * [DOCS] Document :allow_nil option of #validate_uniqueness_of. Closes #3143 [Caio Chassot]
1334
1335 * Bring the sybase adapter up to scratch for 1.2 release. [jsheets]
1336
1337 * Oracle: fix connection reset failure. #6846 [leonlleslie]
1338
1339 * Subclass instantiation doesn't try to explicitly require the corresponding subclass. #6840 [leei, Jeremy Kemper]
1340
1341 * fix faulty inheritance tests and that eager loading grabs the wrong inheritance column when the class of your association is an STI subclass. Closes #6859 [protocool]
1342
1343 * find supports :lock with :include. Check whether your database allows SELECT ... FOR UPDATE with outer joins before using. #6764 [vitaly, Jeremy Kemper]
1344
1345 * Support nil and Array in :conditions => { attr => value } hashes. #6548 [Assaf, Jeremy Kemper]
1346 find(:all, :conditions => { :topic_id => [1, 2, 3], :last_read => nil }
1347
1348 * Quote ActiveSupport::Multibyte::Chars. #6653 [Julian Tarkhanov]
1349
1350 * MySQL: detect when a NOT NULL column without a default value is misreported as default ''. Can't detect for string, text, and binary columns since '' is a legitimate default. #6156 [simon@redhillconsulting.com.au, obrie, Jonathan Viney, Jeremy Kemper]
1351
1352 * validates_numericality_of uses \A \Z to ensure the entire string matches rather than ^ $ which may match one valid line of a multiline string. #5716 [Andreas Schwarz]
1353
1354 * Oracle: automatically detect the primary key. #6594 [vesaria, Michael Schoen]
1355
1356 * Oracle: to increase performance, prefetch 100 rows and enable similar cursor sharing. Both are configurable in database.yml. #6607 [philbogle@gmail.com, ray.fortna@jobster.com, Michael Schoen]
1357
1358 * Firebird: decimal/numeric support. #6408 [macrnic]
1359
1360 * Find with :include respects scoped :order. #5850
1361
1362 * Dynamically generate reader methods for serialized attributes. #6362 [Stefan Kaes]
1363
1364 * Deprecation: object transactions warning. [Jeremy Kemper]
1365
1366 * has_one :dependent => :nullify ignores nil associates. #6528 [janovetz, Jeremy Kemper]
1367
1368 * Oracle: resolve test failures, use prefetched primary key for inserts, check for null defaults, fix limited id selection for eager loading. Factor out some common methods from all adapters. #6515 [Michael Schoen]
1369
1370 * Make add_column use the options hash with the Sqlite Adapter. Closes #6464 [obrie]
1371
1372 * Document other options available to migration's add_column. #6419 [grg]
1373
1374 * MySQL: all_hashes compatibility with old MysqlRes class. #6429, #6601 [Jeremy Kemper]
1375
1376 * Fix has_many :through to add the appropriate conditions when going through an association using STI. Closes #5783. [Jonathan Viney]
1377
1378 * fix select_limited_ids_list issues in postgresql, retain current behavior in other adapters [Rick Olson]
1379
1380 * Restore eager condition interpolation, document it's differences [Rick Olson]
1381
1382 * Don't rollback in teardown unless a transaction was started. Don't start a transaction in create_fixtures if a transaction is started. #6282 [Jacob Fugal, Jeremy Kemper]
1383
1384 * Add #delete support to has_many :through associations. Closes #6049 [Martin Landers]
1385
1386 * Reverted old select_limited_ids_list postgresql fix that caused issues in mysql. Closes #5851 [Rick Olson]
1387
1388 * Removes the ability for eager loaded conditions to be interpolated, since there is no model instance to use as a context for interpolation. #5553 [turnip@turnipspatch.com]
1389
1390 * Added timeout option to SQLite3 configurations to deal more gracefully with SQLite3::BusyException, now the connection can instead retry for x seconds to see if the db clears up before throwing that exception #6126 [wreese@gmail.com]
1391
1392 * Added update_attributes! which uses save! to raise an exception if a validation error prevents saving #6192 [jonathan]
1393
1394 * Deprecated add_on_boundary_breaking (use validates_length_of instead) #6292 [Bob Silva]
1395
1396 * The has_many create method works with polymorphic associations. #6361 [Dan Peterson]
1397
1398 * MySQL: introduce Mysql::Result#all_hashes to support further optimization. #5581 [Stefan Kaes]
1399
1400 * save! shouldn't validate twice. #6324 [maiha, Bob Silva]
1401
1402 * Association collections have an _ids reader method to match the existing writer for collection_select convenience (e.g. employee.task_ids). The writer method skips blank ids so you can safely do @employee.task_ids = params[:tasks] without checking every time for an empty list or blank values. #1887, #5780 [Michael Schuerig]
1403
1404 * Add an attribute reader method for ActiveRecord::Base.observers [Rick Olson]
1405
1406 * Deprecation: count class method should be called with an options hash rather than two args for conditions and joins. #6287 [Bob Silva]
1407
1408 * has_one associations with a nil target may be safely marshaled. #6279 [norbauer, Jeremy Kemper]
1409
1410 * Duplicate the hash provided to AR::Base#to_xml to prevent unexpected side effects [Michael Koziarski]
1411
1412 * Add a :namespace option to AR::Base#to_xml [Michael Koziarski]
1413
1414 * Deprecation tests. Remove warnings for dynamic finders and for the foo_count method if it's also an attribute. [Jeremy Kemper]
1415
1416 * Mock Time.now for more accurate Touch mixin tests. #6213 [Dan Peterson]
1417
1418 * Improve yaml fixtures error reporting. #6205 [Bruce Williams]
1419
1420 * Rename AR::Base#quote so people can use that name in their models. #3628 [Michael Koziarski]
1421
1422 * Add deprecation warning for inferred foreign key. #6029 [Josh Susser]
1423
1424 * Fixed the Ruby/MySQL adapter we ship with Active Record to work with the new authentication handshake that was introduced in MySQL 4.1, along with the other protocol changes made at that time #5723 [jimw@mysql.com]
1425
1426 * Deprecation: use :dependent => :delete_all rather than :exclusively_dependent => true. #6024 [Josh Susser]
1427
1428 * Optimistic locking: gracefully handle nil versions, treat as zero. #5908 [Tom Ward]
1429
1430 * to_xml: the :methods option works on arrays of records. #5845 [Josh Starcher]
1431
1432 * has_many :through conditions are sanitized by the associating class. #5971 [martin.emde@gmail.com]
1433
1434 * Fix spurious newlines and spaces in AR::Base#to_xml output [Jamis Buck]
1435
1436 * has_one supports the :dependent => :delete option which skips the typical callback chain and deletes the associated object directly from the database. #5927 [Chris Mear, Jonathan Viney]
1437
1438 * Nested subclasses are not prefixed with the parent class' table_name since they should always use the base class' table_name. #5911 [Jonathan Viney]
1439
1440 * SQLServer: work around bug where some unambiguous date formats are not correctly identified if the session language is set to german. #5894 [Tom Ward, kruth@bfpi]
1441
1442 * Clashing type columns due to a sloppy join shouldn't wreck single-table inheritance. #5838 [Kevin Clark]
1443
1444 * Fixtures: correct escaping of \n and \r. #5859 [evgeny.zislis@gmail.com]
1445
1446 * Migrations: gracefully handle missing migration files. #5857 [eli.gordon@gmail.com]
1447
1448 * MySQL: update test schema for MySQL 5 strict mode. #5861 [Tom Ward]
1449
1450 * to_xml: correct naming of included associations. #5831 [Josh Starcher]
1451
1452 * Pushing a record onto a has_many :through sets the association's foreign key to the associate's primary key and adds it to the correct association. #5815, #5829 [Josh Susser]
1453
1454 * Add records to has_many :through using <<, push, and concat by creating the association record. Raise if base or associate are new records since both ids are required to create the association. #build raises since you can't associate an unsaved record. #create! takes an attributes hash and creates the associated record and its association in a transaction. [Jeremy Kemper]
1455
1456 # Create a tagging to associate the post and tag.
1457 post.tags << Tag.find_by_name('old')
1458 post.tags.create! :name => 'general'
1459
1460 # Would have been:
1461 post.taggings.create!(:tag => Tag.find_by_name('finally')
1462 transaction do
1463 post.taggings.create!(:tag => Tag.create!(:name => 'general'))
1464 end
1465
1466 * Cache nil results for :included has_one associations also. #5787 [Michael Schoen]
1467
1468 * Fixed a bug which would cause .save to fail after trying to access a empty has_one association on a unsaved record. [Tobias Lütke]
1469
1470 * Nested classes are given table names prefixed by the singular form of the parent's table name. [Jeremy Kemper]
1471 Example: Invoice::Lineitem is given table name invoice_lineitems
1472
1473 * Migrations: uniquely name multicolumn indexes so you don't have to. [Jeremy Kemper]
1474 # people_active_last_name_index, people_active_deactivated_at_index
1475 add_index :people, [:active, :last_name]
1476 add_index :people, [:active, :deactivated_at]
1477 remove_index :people, [:active, :last_name]
1478 remove_index :people, [:active, :deactivated_at]
1479
1480 WARNING: backward-incompatibility. Multicolumn indexes created before this
1481 revision were named using the first column name only. Now they're uniquely
1482 named using all indexed columns.
1483
1484 To remove an old multicolumn index, remove_index :table_name, :first_column
1485
1486 * Fix for deep includes on the same association. [richcollins@gmail.com]
1487
1488 * Tweak fixtures so they don't try to use a non-ActiveRecord class. [Kevin Clark]
1489
1490 * Remove ActiveRecord::Base.reset since Dispatcher doesn't use it anymore. [Rick Olson]
1491
1492 * PostgreSQL: autodetected sequences work correctly with multiple schemas. Rely on the schema search_path instead of explicitly qualifying the sequence name with its schema. #5280 [guy.naor@famundo.com]
1493
1494 * Replace Reloadable with Reloadable::Deprecated. [Nicholas Seckar]
1495
1496 * Cache nil results for has_one associations so multiple calls don't call the database. Closes #5757. [Michael Schoen]
1497
1498 * Don't save has_one associations unnecessarily. #5735 [Jonathan Viney]
1499
1500 * Refactor ActiveRecord::Base.reset_subclasses to #reset, and add global observer resetting. [Rick Olson]
1501
1502 * Formally deprecate the deprecated finders. [Michael Koziarski]
1503
1504 * Formally deprecate rich associations. [Michael Koziarski]
1505
1506 * Fixed that default timezones for new / initialize should uphold utc setting #5709 [daniluk@yahoo.com]
1507
1508 * Fix announcement of very long migration names. #5722 [blake@near-time.com]
1509
1510 * The exists? class method should treat a string argument as an id rather than as conditions. #5698 [jeremy@planetargon.com]
1511
1512 * Fixed to_xml with :include misbehaviors when invoked on array of model instances #5690 [alexkwolfe@gmail.com]
1513
1514 * Added support for conditions on Base.exists? #5689 [Josh Peek]. Examples:
1515
1516 assert (Topic.exists?(:author_name => "David"))
1517 assert (Topic.exists?(:author_name => "Mary", :approved => true))
1518 assert (Topic.exists?(["parent_id = ?", 1]))
1519
1520 * Schema dumper quotes date :default values. [Dave Thomas]
1521
1522 * Calculate sum with SQL, not Enumerable on HasManyThrough Associations. [Dan Peterson]
1523
1524 * Factor the attribute#{suffix} methods out of method_missing for easier extension. [Jeremy Kemper]
1525
1526 * Patch sql injection vulnerability when using integer or float columns. [Jamis Buck]
1527
1528 * Allow #count through a has_many association to accept :include. [Dan Peterson]
1529
1530 * create_table rdoc: suggest :id => false for habtm join tables. [Zed Shaw]
1531
1532 * PostgreSQL: return array fields as strings. #4664 [Robby Russell]
1533
1534 * SQLServer: added tests to ensure all database statements are closed, refactored identity_insert management code to use blocks, removed update/delete rowcount code out of execute and into update/delete, changed insert to go through execute method, removed unused quoting methods, disabled pessimistic locking tests as feature is currently unsupported, fixed RakeFile to load sqlserver specific tests whether running in ado or odbc mode, fixed support for recently added decimal types, added support for limits on integer types. #5670 [Tom Ward]
1535
1536 * SQLServer: fix db:schema:dump case-sensitivity. #4684 [Will Rogers]
1537
1538 * Oracle: BigDecimal support. #5667 [Michael Schoen]
1539
1540 * Numeric and decimal columns map to BigDecimal instead of Float. Those with scale 0 map to Integer. #5454 [robbat2@gentoo.org, work@ashleymoran.me.uk]
1541
1542 * Firebird migrations support. #5337 [Ken Kunz <kennethkunz@gmail.com>]
1543
1544 * PostgreSQL: create/drop as postgres user. #4790 [mail@matthewpainter.co.uk, mlaster@metavillage.com]
1545
1546 * PostgreSQL: correctly quote the ' in pk_and_sequence_for. #5462 [tietew@tietew.net]
1547
1548 * PostgreSQL: correctly quote microseconds in timestamps. #5641 [rick@rickbradley.com]
1549
1550 * Clearer has_one/belongs_to model names (account has_one :user). #5632 [matt@mattmargolis.net]
1551
1552 * Oracle: use nonblocking queries if allow_concurrency is set, fix pessimistic locking, don't guess date vs. time by default (set OracleAdapter.emulate_dates = true for the old behavior), adapter cleanup. #5635 [Michael Schoen]
1553
1554 * Fixed a few Oracle issues: Allows Oracle's odd date handling to still work consistently within #to_xml, Passes test that hardcode insert statement by dropping the :id column, Updated RUNNING_UNIT_TESTS with Oracle instructions, Corrects method signature for #exec #5294 [Michael Schoen]
1555
1556 * Added :group to available options for finds done on associations #5516 [mike@michaeldewey.org]
1557
1558 * Observers also watch subclasses created after they are declared. #5535 [daniels@pronto.com.au]
1559
1560 * Removed deprecated timestamps_gmt class methods. [Jeremy Kemper]
1561
1562 * rake build_mysql_database grants permissions to rails@localhost. #5501 [brianegge@yahoo.com]
1563
1564 * PostgreSQL: support microsecond time resolution. #5492 [alex@msgpad.com]
1565
1566 * Add AssociationCollection#sum since the method_missing invokation has been shadowed by Enumerable#sum.
1567
1568 * Added find_or_initialize_by_X which works like find_or_create_by_X but doesn't save the newly instantiated record. [Sam Stephenson]
1569
1570 * Row locking. Provide a locking clause with the :lock finder option or true for the default "FOR UPDATE". Use the #lock! method to obtain a row lock on a single record (reloads the record with :lock => true). [Shugo Maeda]
1571 # Obtain an exclusive lock on person 1 so we can safely increment visits.
1572 Person.transaction do
1573 # select * from people where id=1 for update
1574 person = Person.find(1, :lock => true)
1575 person.visits += 1
1576 person.save!
1577 end
1578
1579 * PostgreSQL: introduce allow_concurrency option which determines whether to use blocking or asynchronous #execute. Adapters with blocking #execute will deadlock Ruby threads. The default value is ActiveRecord::Base.allow_concurrency. [Jeremy Kemper]
1580
1581 * Use a per-thread (rather than global) transaction mutex so you may execute concurrent transactions on separate connections. [Jeremy Kemper]
1582
1583 * Change AR::Base#to_param to return a String instead of a Fixnum. Closes #5320. [Nicholas Seckar]
1584
1585 * Use explicit delegation instead of method aliasing for AR::Base.to_param -> AR::Base.id. #5299 (skaes@web.de)
1586
1587 * Refactored ActiveRecord::Base.to_xml to become a delegate for XmlSerializer, which restores sanity to the mega method. This refactoring also reinstates the opinions that type="string" is redundant and ugly and nil-differentiation is not a concern of serialization [David Heinemeier Hansson]
1588
1589 * Added simple hash conditions to find that'll just convert hash to an AND-based condition string #5143 [Hampton Catlin]. Example:
1590
1591 Person.find(:all, :conditions => { :last_name => "Catlin", :status => 1 }, :limit => 2)
1592
1593 ...is the same as:
1594
1595 Person.find(:all, :conditions => [ "last_name = ? and status = ?", "Catlin", 1 ], :limit => 2)
1596
1597 This makes it easier to pass in the options from a form or otherwise outside.
1598
1599
1600 * Fixed issues with BLOB limits, charsets, and booleans for Firebird #5194, #5191, #5189 [kennethkunz@gmail.com]
1601
1602 * Fixed usage of :limit and with_scope when the association in scope is a 1:m #5208 [alex@purefiction.net]
1603
1604 * Fixed migration trouble with SQLite when NOT NULL is used in the new definition #5215 [greg@lapcominc.com]
1605
1606 * Fixed problems with eager loading and counting on SQL Server #5212 [kajism@yahoo.com]
1607
1608 * Fixed that count distinct should use the selected column even when using :include #5251 [anna@wota.jp]
1609
1610 * Fixed that :includes merged from with_scope won't cause the same association to be loaded more than once if repetition occurs in the clauses #5253 [alex@purefiction.net]
1611
1612 * Allow models to override to_xml. #4989 [Blair Zajac <blair@orcaware.com>]
1613
1614 * PostgreSQL: don't ignore port when host is nil since it's often used to label the domain socket. #5247 [shimbo@is.naist.jp]
1615
1616 * Records and arrays of records are bound as quoted ids. [Jeremy Kemper]
1617 Foo.find(:all, :conditions => ['bar_id IN (?)', bars])
1618 Foo.find(:first, :conditions => ['bar_id = ?', bar])
1619
1620 * Fixed that Base.find :all, :conditions => [ "id IN (?)", collection ] would fail if collection was empty [David Heinemeier Hansson]
1621
1622 * Add a list of regexes assert_queries skips in the ActiveRecord test suite. [Rick Olson]
1623
1624 * Fix the has_and_belongs_to_many #create doesn't populate the join for new records. Closes #3692 [Josh Susser]
1625
1626 * Provide Association Extensions access to the instance that the association is being accessed from.
1627 Closes #4433 [Josh Susser]
1628
1629 * Update OpenBase adaterp's maintainer's email address. Closes #5176. [Derrick Spell]
1630
1631 * Add a quick note about :select and eagerly included associations. [Rick Olson]
1632
1633 * Add docs for the :as option in has_one associations. Closes #5144 [cdcarter@gmail.com]
1634
1635 * Fixed that has_many collections shouldn't load the entire association to do build or create [David Heinemeier Hansson]
1636
1637 * Added :allow_nil option for aggregations #5091 [Ian White]
1638
1639 * Fix Oracle boolean support and tests. Closes #5139. [Michael Schoen]
1640
1641 * create! no longer blows up when no attributes are passed and a :create scope is in effect (e.g. foo.bars.create! failed whereas foo.bars.create!({}) didn't.) [Jeremy Kemper]
1642
1643 * Call Inflector#demodulize on the class name when eagerly including an STI model. Closes #5077 [info@loobmedia.com]
1644
1645 * Preserve MySQL boolean column defaults when changing a column in a migration. Closes #5015. [pdcawley@bofh.org.uk]
1646
1647 * PostgreSQL: migrations support :limit with :integer columns by mapping limit < 4 to smallint, > 4 to bigint, and anything else to integer. #2900 [keegan@thebasement.org]
1648
1649 * Dates and times interpret empty strings as nil rather than 2000-01-01. #4830 [kajism@yahoo.com]
1650
1651 * Allow :uniq => true with has_many :through associations. [Jeremy Kemper]
1652
1653 * Ensure that StringIO is always available for the Schema dumper. [Marcel Molina Jr.]
1654
1655 * Allow AR::Base#to_xml to include methods too. Closes #4921. [johan@textdrive.com]
1656
1657 * Remove duplicate fixture entry in comments.yml. Closes #4923. [Blair Zajac <blair@orcaware.com>]
1658
1659 * When grouping, use the appropriate option key. [Marcel Molina Jr.]
1660
1661 * Add support for FrontBase (http://www.frontbase.com/) with a new adapter thanks to the hard work of one Mike Laster. Closes #4093. [mlaster@metavillage.com]
1662
1663 * Add warning about the proper way to validate the presence of a foreign key. Closes #4147. [Francois Beausoleil <francois.beausoleil@gmail.com>]
1664
1665 * Fix syntax error in documentation. Closes #4679. [Mislav Marohnić]
1666
1667 * Add Oracle support for CLOB inserts. Closes #4748. [schoenm@earthlink.net sandra.metz@duke.edu]
1668
1669 * Various fixes for sqlserver_adapter (odbc statement finishing, ado schema dumper, drop index). Closes #4831. [kajism@yahoo.com]
1670
1671 * Add support for :order option to with_scope. Closes #3887. [eric.daspet@survol.net]
1672
1673 * Prettify output of schema_dumper by making things line up. Closes #4241 [Caio Chassot <caio@v2studio.com>]
1674
1675 * Make build_postgresql_databases task make databases owned by the postgres user. Closes #4790. [mlaster@metavillage.com]
1676
1677 * Sybase Adapter type conversion cleanup. Closes #4736. [dev@metacasa.net]
1678
1679 * Fix bug where calculations with long alias names return null. [Rick Olson]
1680
1681 * Raise error when trying to add to a has_many :through association. Use the Join Model instead. [Rick Olson]
1682
1683 @post.tags << @tag # BAD
1684 @post.taggings.create(:tag => @tag) # GOOD
1685
1686 * Allow all calculations to take the :include option, not just COUNT (closes #4840) [Rick Olson]
1687
1688 * Add ActiveRecord::Errors#to_xml [Jamis Buck]
1689
1690 * Properly quote index names in migrations (closes #4764) [John Long]
1691
1692 * Fix the HasManyAssociation#count method so it uses the new ActiveRecord::Base#count syntax, while maintaining backwards compatibility. [Rick Olson]
1693
1694 * Ensure that Associations#include_eager_conditions? checks both scoped and explicit conditions [Rick Olson]
1695
1696 * Associations#select_limited_ids_list adds the ORDER BY columns to the SELECT DISTINCT List for postgresql. [Rick Olson]
1697
1698 * Add :case_sensitive option to validates_uniqueness_of (closes #3090) [Rick Olson]
1699
1700 class Account < ActiveRecord::Base
1701 validates_uniqueness_of :email, :case_sensitive => false
1702 end
1703
1704 * Allow multiple association extensions with :extend option (closes #4666) [Josh Susser]
1705
1706 class Account < ActiveRecord::Base
1707 has_many :people, :extend => [FindOrCreateByNameExtension, FindRecentExtension]
1708 end
1709
1710
1711 *1.14.4* (August 8th, 2006)
1712
1713 * Add warning about the proper way to validate the presence of a foreign key. #4147 [Francois Beausoleil <francois.beausoleil@gmail.com>]
1714
1715 * Fix syntax error in documentation. #4679 [Mislav Marohnić]
1716
1717 * Update inconsistent migrations documentation. #4683 [machomagna@gmail.com]
1718
1719
1720 *1.14.3* (June 27th, 2006)
1721
1722 * Fix announcement of very long migration names. #5722 [blake@near-time.com]
1723
1724 * Update callbacks documentation. #3970 [Robby Russell <robby@planetargon.com>]
1725
1726 * Properly quote index names in migrations (closes #4764) [John Long]
1727
1728 * Ensure that Associations#include_eager_conditions? checks both scoped and explicit conditions [Rick Olson]
1729
1730 * Associations#select_limited_ids_list adds the ORDER BY columns to the SELECT DISTINCT List for postgresql. [Rick Olson]
1731
1732
1733 *1.14.2* (April 9th, 2006)
1734
1735 * Fixed calculations for the Oracle Adapter (closes #4626) [Michael Schoen]
1736
1737
1738 *1.14.1* (April 6th, 2006)
1739
1740 * Fix type_name_with_module to handle type names that begin with '::'. Closes #4614. [Nicholas Seckar]
1741
1742 * Fixed that that multiparameter assignment doesn't work with aggregations (closes #4620) [Lars Pind]
1743
1744 * Enable Limit/Offset in Calculations (closes #4558) [lmarlow]
1745
1746 * Fixed that loading including associations returns all results if Load IDs For Limited Eager Loading returns none (closes #4528) [Rick Olson]
1747
1748 * Fixed HasManyAssociation#find bugs when :finder_sql is set #4600 [lagroue@free.fr]
1749
1750 * Allow AR::Base#respond_to? to behave when @attributes is nil [Ryan Davis]
1751
1752 * Support eager includes when going through a polymorphic has_many association. [Rick Olson]
1753
1754 * Added support for eagerly including polymorphic has_one associations. (closes #4525) [Rick Olson]
1755
1756 class Post < ActiveRecord::Base
1757 has_one :tagging, :as => :taggable
1758 end
1759
1760 Post.find :all, :include => :tagging
1761
1762 * Added descriptive error messages for invalid has_many :through associations: going through :has_one or :has_and_belongs_to_many [Rick Olson]
1763
1764 * Added support for going through a polymorphic has_many association: (closes #4401) [Rick Olson]
1765
1766 class PhotoCollection < ActiveRecord::Base
1767 has_many :photos, :as => :photographic
1768 belongs_to :firm
1769 end
1770
1771 class Firm < ActiveRecord::Base
1772 has_many :photo_collections
1773 has_many :photos, :through => :photo_collections
1774 end
1775
1776 * Multiple fixes and optimizations in PostgreSQL adapter, allowing ruby-postgres gem to work properly. [ruben.nine@gmail.com]
1777
1778 * Fixed that AssociationCollection#delete_all should work even if the records of the association are not loaded yet. [Florian Weber]
1779
1780 * Changed those private ActiveRecord methods to take optional third argument :auto instead of nil for performance optimizations. (closes #4456) [Stefan]
1781
1782 * Private ActiveRecord methods add_limit!, add_joins!, and add_conditions! take an OPTIONAL third argument 'scope' (closes #4456) [Rick Olson]
1783
1784 * DEPRECATED: Using additional attributes on has_and_belongs_to_many associations. Instead upgrade your association to be a real join model [David Heinemeier Hansson]
1785
1786 * Fixed that records returned from has_and_belongs_to_many associations with additional attributes should be marked as read only (fixes #4512) [David Heinemeier Hansson]
1787
1788 * Do not implicitly mark recordss of has_many :through as readonly but do mark habtm records as readonly (eventually only on join tables without rich attributes). [Marcel Mollina Jr.]
1789
1790 * Fixed broken OCIAdapter #4457 [Michael Schoen]
1791
1792
1793 *1.14.0* (March 27th, 2006)
1794
1795 * Replace 'rescue Object' with a finer grained rescue. Closes #4431. [Nicholas Seckar]
1796
1797 * Fixed eager loading so that an aliased table cannot clash with a has_and_belongs_to_many join table [Rick Olson]
1798
1799 * Add support for :include to with_scope [andrew@redlinesoftware.com]
1800
1801 * Support the use of public synonyms with the Oracle adapter; required ruby-oci8 v0.1.14 #4390 [Michael Schoen]
1802
1803 * Change periods (.) in table aliases to _'s. Closes #4251 [jeff@ministrycentered.com]
1804
1805 * Changed has_and_belongs_to_many join to INNER JOIN for Mysql 3.23.x. Closes #4348 [Rick Olson]
1806
1807 * Fixed issue that kept :select options from being scoped [Rick Olson]
1808
1809 * Fixed db_schema_import when binary types are present #3101 [David Heinemeier Hansson]
1810
1811 * Fixed that MySQL enums should always be returned as strings #3501 [David Heinemeier Hansson]
1812
1813 * Change has_many :through to use the :source option to specify the source association. :class_name is now ignored. [Rick Olson]
1814
1815 class Connection < ActiveRecord::Base
1816 belongs_to :user
1817 belongs_to :channel
1818 end
1819
1820 class Channel < ActiveRecord::Base
1821 has_many :connections
1822 has_many :contacts, :through => :connections, :class_name => 'User' # OLD
1823 has_many :contacts, :through => :connections, :source => :user # NEW
1824 end
1825
1826 * Fixed DB2 adapter so nullable columns will be determines correctly now and quotes from column default values will be removed #4350 [contact@maik-schmidt.de]
1827
1828 * Allow overriding of find parameters in scoped has_many :through calls [Rick Olson]
1829
1830 In this example, :include => false disables the default eager association from loading. :select changes the standard
1831 select clause. :joins specifies a join that is added to the end of the has_many :through query.
1832
1833 class Post < ActiveRecord::Base
1834 has_many :tags, :through => :taggings, :include => :tagging do
1835 def add_joins_and_select
1836 find :all, :select => 'tags.*, authors.id as author_id', :include => false,
1837 :joins => 'left outer join posts on taggings.taggable_id = posts.id left outer join authors on posts.author_id = authors.id'
1838 end
1839 end
1840 end
1841
1842 * Fixed that schema changes while the database was open would break any connections to a SQLite database (now we reconnect if that error is throw) [David Heinemeier Hansson]
1843
1844 * Don't classify the has_one class when eager loading, it is already singular. Add tests. (closes #4117) [Jonathan Viney]
1845
1846 * Quit ignoring default :include options in has_many :through calls [Mark James]
1847
1848 * Allow has_many :through associations to find the source association by setting a custom class (closes #4307) [Jonathan Viney]
1849
1850 * Eager Loading support added for has_many :through => :has_many associations (see below). [Rick Olson]
1851
1852 * Allow has_many :through to work on has_many associations (closes #3864) [sco@scottraymond.net] Example:
1853
1854 class Firm < ActiveRecord::Base
1855 has_many :clients
1856 has_many :invoices, :through => :clients
1857 end
1858
1859 class Client < ActiveRecord::Base
1860 belongs_to :firm
1861 has_many :invoices
1862 end
1863
1864 class Invoice < ActiveRecord::Base
1865 belongs_to :client
1866 end
1867
1868 * Raise error when trying to select many polymorphic objects with has_many :through or :include (closes #4226) [Josh Susser]
1869
1870 * Fixed has_many :through to include :conditions set on the :through association. closes #4020 [Jonathan Viney]
1871
1872 * Fix that has_many :through honors the foreign key set by the belongs_to association in the join model (closes #4259) [andylien@gmail.com / Rick Olson]
1873
1874 * SQL Server adapter gets some love #4298 [Ryan Tomayko]
1875
1876 * Added OpenBase database adapter that builds on top of the http://www.spice-of-life.net/ruby-openbase/ driver. All functionality except LIMIT/OFFSET is supported #3528 [derrickspell@cdmplus.com]
1877
1878 * Rework table aliasing to account for truncated table aliases. Add smarter table aliasing when doing eager loading of STI associations. This allows you to use the association name in the order/where clause. [Jonathan Viney / Rick Olson] #4108 Example (SpecialComment is using STI):
1879
1880 Author.find(:all, :include => { :posts => :special_comments }, :order => 'special_comments.body')
1881
1882 * Add AbstractAdapter#table_alias_for to create table aliases according to the rules of the current adapter. [Rick Olson]
1883
1884 * Provide access to the underlying database connection through Adapter#raw_connection. Enables the use of db-specific methods without complicating the adapters. #2090 [Michael Koziarski]
1885
1886 * Remove broken attempts at handling columns with a default of 'now()' in the postgresql adapter. #2257 [Michael Koziarski]
1887
1888 * Added connection#current_database that'll return of the current database (only works in MySQL, SQL Server, and Oracle so far -- please help implement for the rest of the adapters) #3663 [Tom Ward]
1889
1890 * Fixed that Migration#execute would have the table name prefix appended to its query #4110 [mark.imbriaco@pobox.com]
1891
1892 * Make all tinyint(1) variants act like boolean in mysql (tinyint(1) unsigned, etc.) [Jamis Buck]
1893
1894 * Use association's :conditions when eager loading. [Jeremy Evans] #4144
1895
1896 * Alias the has_and_belongs_to_many join table on eager includes. #4106 [Jeremy Evans]
1897
1898 This statement would normally error because the projects_developers table is joined twice, and therefore joined_on would be ambiguous.
1899
1900 Developer.find(:all, :include => {:projects => :developers}, :conditions => 'join_project_developers.joined_on IS NOT NULL')
1901
1902 * Oracle adapter gets some love #4230 [Michael Schoen]
1903
1904 * Changes :text to CLOB rather than BLOB [Moses Hohman]
1905 * Fixes an issue with nil numeric length/scales (several)
1906 * Implements support for XMLTYPE columns [wilig / Kubo Takehiro]
1907 * Tweaks a unit test to get it all green again
1908 * Adds support for #current_database
1909
1910 * Added Base.abstract_class? that marks which classes are not part of the Active Record hierarchy #3704 [Rick Olson]
1911
1912 class CachedModel < ActiveRecord::Base
1913 self.abstract_class = true
1914 end
1915
1916 class Post < CachedModel
1917 end
1918
1919 CachedModel.abstract_class?
1920 => true
1921
1922 Post.abstract_class?
1923 => false
1924
1925 Post.base_class
1926 => Post
1927
1928 Post.table_name
1929 => 'posts'
1930
1931 * Allow :dependent options to be used with polymorphic joins. #3820 [Rick Olson]
1932
1933 class Foo < ActiveRecord::Base
1934 has_many :attachments, :as => :attachable, :dependent => :delete_all
1935 end
1936
1937 * Nicer error message on has_many :through when :through reflection can not be found. #4042 [court3nay]
1938
1939 * Upgrade to Transaction::Simple 1.3 [Jamis Buck]
1940
1941 * Catch FixtureClassNotFound when using instantiated fixtures on a fixture that has no ActiveRecord model [Rick Olson]
1942
1943 * Allow ordering of calculated results and/or grouped fields in calculations [solo@gatelys.com]
1944
1945 * Make ActiveRecord::Base#save! return true instead of nil on success. #4173 [johan@johansorensen.com]
1946
1947 * Dynamically set allow_concurrency. #4044 [Stefan Kaes]
1948
1949 * Added Base#to_xml that'll turn the current record into a XML representation [David Heinemeier Hansson]. Example:
1950
1951 topic.to_xml
1952
1953 ...returns:
1954
1955 <?xml version="1.0" encoding="UTF-8"?>
1956 <topic>
1957 <title>The First Topic</title>
1958 <author-name>David</author-name>
1959 <id type="integer">1</id>
1960 <approved type="boolean">false</approved>
1961 <replies-count type="integer">0</replies-count>
1962 <bonus-time type="datetime">2000-01-01 08:28:00</bonus-time>
1963 <written-on type="datetime">2003-07-16 09:28:00</written-on>
1964 <content>Have a nice day</content>
1965 <author-email-address>david@loudthinking.com</author-email-address>
1966 <parent-id></parent-id>
1967 <last-read type="date">2004-04-15</last-read>
1968 </topic>
1969
1970 ...and you can configure with:
1971
1972 topic.to_xml(:skip_instruct => true, :except => [ :id, bonus_time, :written_on, replies_count ])
1973
1974 ...that'll return:
1975
1976 <topic>
1977 <title>The First Topic</title>
1978 <author-name>David</author-name>
1979 <approved type="boolean">false</approved>
1980 <content>Have a nice day</content>
1981 <author-email-address>david@loudthinking.com</author-email-address>
1982 <parent-id></parent-id>
1983 <last-read type="date">2004-04-15</last-read>
1984 </topic>
1985
1986 You can even do load first-level associations as part of the document:
1987
1988 firm.to_xml :include => [ :account, :clients ]
1989
1990 ...that'll return something like:
1991
1992 <?xml version="1.0" encoding="UTF-8"?>
1993 <firm>
1994 <id type="integer">1</id>
1995 <rating type="integer">1</rating>
1996 <name>37signals</name>
1997 <clients>
1998 <client>
1999 <rating type="integer">1</rating>
2000 <name>Summit</name>
2001 </client>
2002 <client>
2003 <rating type="integer">1</rating>
2004 <name>Microsoft</name>
2005 </client>
2006 </clients>
2007 <account>
2008 <id type="integer">1</id>
2009 <credit-limit type="integer">50</credit-limit>
2010 </account>
2011 </firm>
2012
2013 * Allow :counter_cache to take a column name for custom counter cache columns [Jamis Buck]
2014
2015 * Documentation fixes for :dependent [robby@planetargon.com]
2016
2017 * Stop the MySQL adapter crashing when views are present. #3782 [Jonathan Viney]
2018
2019 * Don't classify the belongs_to class, it is already singular #4117 [keithm@infused.org]
2020
2021 * Allow set_fixture_class to take Classes instead of strings for a class in a module. Raise FixtureClassNotFound if a fixture can't load. [Rick Olson]
2022
2023 * Fix quoting of inheritance column for STI eager loading #4098 [Jonathan Viney <jonathan@bluewire.net.nz>]
2024
2025 * Added smarter table aliasing for eager associations for multiple self joins #3580 [Rick Olson]
2026
2027 * The first time a table is referenced in a join, no alias is used.
2028 * After that, the parent class name and the reflection name are used.
2029
2030 Tree.find(:all, :include => :children) # LEFT OUTER JOIN trees AS tree_children ...
2031
2032 * Any additional join references get a numerical suffix like '_2', '_3', etc.
2033
2034 * Fixed eager loading problems with single-table inheritance #3580 [Rick Olson]. Post.find(:all, :include => :special_comments) now returns all posts, and any special comments that the posts may have. And made STI work with has_many :through and polymorphic belongs_to.
2035
2036 * Added cascading eager loading that allows for queries like Author.find(:all, :include=> { :posts=> :comments }), which will fetch all authors, their posts, and the comments belonging to those posts in a single query (using LEFT OUTER JOIN) #3913 [anna@wota.jp]. Examples:
2037
2038 # cascaded in two levels
2039 >> Author.find(:all, :include=>{:posts=>:comments})
2040 => authors
2041 +- posts
2042 +- comments
2043
2044 # cascaded in two levels and normal association
2045 >> Author.find(:all, :include=>[{:posts=>:comments}, :categorizations])
2046 => authors
2047 +- posts
2048 +- comments
2049 +- categorizations
2050
2051 # cascaded in two levels with two has_many associations
2052 >> Author.find(:all, :include=>{:posts=>[:comments, :categorizations]})
2053 => authors
2054 +- posts
2055 +- comments
2056 +- categorizations
2057
2058 # cascaded in three levels
2059 >> Company.find(:all, :include=>{:groups=>{:members=>{:favorites}}})
2060 => companies
2061 +- groups
2062 +- members
2063 +- favorites
2064
2065 * Make counter cache work when replacing an association #3245 [eugenol@gmail.com]
2066
2067 * Make migrations verbose [Jamis Buck]
2068
2069 * Make counter_cache work with polymorphic belongs_to [Jamis Buck]
2070
2071 * Fixed that calling HasOneProxy#build_model repeatedly would cause saving to happen #4058 [anna@wota.jp]
2072
2073 * Added Sybase database adapter that relies on the Sybase Open Client bindings (see http://raa.ruby-lang.org/project/sybase-ctlib) #3765 [John Sheets]. It's almost completely Active Record compliant (including migrations), but has the following caveats:
2074
2075 * Does not support DATE SQL column types; use DATETIME instead.
2076 * Date columns on HABTM join tables are returned as String, not Time.
2077 * Insertions are potentially broken for :polymorphic join tables
2078 * BLOB column access not yet fully supported
2079
2080 * Clear stale, cached connections left behind by defunct threads. [Jeremy Kemper]
2081
2082 * CHANGED DEFAULT: set ActiveRecord::Base.allow_concurrency to false. Most AR usage is in single-threaded applications. [Jeremy Kemper]
2083
2084 * Renamed the "oci" adapter to "oracle", but kept the old name as an alias #4017 [Michael Schoen]
2085
2086 * Fixed that Base.save should always return false if the save didn't succeed, including if it has halted by before_save's #1861, #2477 [David Heinemeier Hansson]
2087
2088 * Speed up class -> connection caching and stale connection verification. #3979 [Stefan Kaes]
2089
2090 * Add set_fixture_class to allow the use of table name accessors with models which use set_table_name. [Kevin Clark]
2091
2092 * Added that fixtures to placed in subdirectories of the main fixture files are also loaded #3937 [dblack@wobblini.net]
2093
2094 * Define attribute query methods to avoid method_missing calls. #3677 [Jonathan Viney]
2095
2096 * ActiveRecord::Base.remove_connection explicitly closes database connections and doesn't corrupt the connection cache. Introducing the disconnect! instance method for the PostgreSQL, MySQL, and SQL Server adapters; implementations for the others are welcome. #3591 [Simon Stapleton, Tom Ward]
2097
2098 * Added support for nested scopes #3407 [anna@wota.jp]. Examples:
2099
2100 Developer.with_scope(:find => { :conditions => "salary > 10000", :limit => 10 }) do
2101 Developer.find(:all) # => SELECT * FROM developers WHERE (salary > 10000) LIMIT 10
2102
2103 # inner rule is used. (all previous parameters are ignored)
2104 Developer.with_exclusive_scope(:find => { :conditions => "name = 'Jamis'" }) do
2105 Developer.find(:all) # => SELECT * FROM developers WHERE (name = 'Jamis')
2106 end
2107
2108 # parameters are merged
2109 Developer.with_scope(:find => { :conditions => "name = 'Jamis'" }) do
2110 Developer.find(:all) # => SELECT * FROM developers WHERE (( salary > 10000 ) AND ( name = 'Jamis' )) LIMIT 10
2111 end
2112 end
2113
2114 * Fixed db2 connection with empty user_name and auth options #3622 [phurley@gmail.com]
2115
2116 * Fixed validates_length_of to work on UTF-8 strings by using characters instead of bytes #3699 [Masao Mutoh]
2117
2118 * Fixed that reflections would bleed across class boundaries in single-table inheritance setups #3796 [Lars Pind]
2119
2120 * Added calculations: Base.count, Base.average, Base.sum, Base.minimum, Base.maxmium, and the generic Base.calculate. All can be used with :group and :having. Calculations and statitics need no longer require custom SQL. #3958 [Rick Olson]. Examples:
2121
2122 Person.average :age
2123 Person.minimum :age
2124 Person.maximum :age
2125 Person.sum :salary, :group => :last_name
2126
2127 * Renamed Errors#count to Errors#size but kept an alias for the old name (and included an alias for length too) #3920 [Luke Redpath]
2128
2129 * Reflections don't attempt to resolve module nesting of association classes. Simplify type computation. [Jeremy Kemper]
2130
2131 * Improved the Oracle OCI Adapter with better performance for column reflection (from #3210), fixes to migrations (from #3476 and #3742), tweaks to unit tests (from #3610), and improved documentation (from #2446) #3879 [Aggregated by schoenm@earthlink.net]
2132
2133 * Fixed that the schema_info table used by ActiveRecord::Schema.define should respect table pre- and suffixes #3834 [rubyonrails@atyp.de]
2134
2135 * Added :select option to Base.count that'll allow you to select something else than * to be counted on. Especially important for count queries using DISTINCT #3839 [Stefan Kaes]
2136
2137 * Correct syntax error in mysql DDL, and make AAACreateTablesTest run first [Bob Silva]
2138
2139 * Allow :include to be used with has_many :through associations #3611 [Michael Schoen]
2140
2141 * PostgreSQL: smarter schema dumps using pk_and_sequence_for(table). #2920 [Blair Zajac]
2142
2143 * SQLServer: more compatible limit/offset emulation. #3779 [Tom Ward]
2144
2145 * Polymorphic join support for has_one associations (has_one :foo, :as => :bar) #3785 [Rick Olson]
2146
2147 * PostgreSQL: correctly parse negative integer column defaults. #3776 [bellis@deepthought.org]
2148
2149 * Fix problems with count when used with :include [Jeremy Hopple and Kevin Clark]
2150
2151 * ActiveRecord::RecordInvalid now states which validations failed in its default error message [Tobias Lütke]
2152
2153 * Using AssociationCollection#build with arrays of hashes should call build, not create [David Heinemeier Hansson]
2154
2155 * Remove definition of reloadable? from ActiveRecord::Base to make way for new Reloadable code. [Nicholas Seckar]
2156
2157 * Fixed schema handling for DB2 adapter that didn't work: an initial schema could be set, but it wasn't used when getting tables and indexes #3678 [Maik Schmidt]
2158
2159 * Support the :column option for remove_index with the PostgreSQL adapter. #3661 [Shugo Maeda]
2160
2161 * Add documentation for add_index and remove_index. #3600 [Manfred Stienstra <m.stienstra@fngtps.com>]
2162
2163 * If the OCI library is not available, raise an exception indicating as much. #3593 [Michael Schoen]
2164
2165 * Add explicit :order in finder tests as postgresql orders results differently by default. #3577. [Rick Olson]
2166
2167 * Make dynamic finders honor additional passed in :conditions. #3569 [Oleg Pudeyev <pudeyo@rpi.edu>, Marcel Molina Jr.]
2168
2169 * Show a meaningful error when the DB2 adapter cannot be loaded due to missing dependencies. [Nicholas Seckar]
2170
2171 * Make .count work for has_many associations with multi line finder sql [Michael Schoen]
2172
2173 * Add AR::Base.base_class for querying the ancestor AR::Base subclass [Jamis Buck]
2174
2175 * Allow configuration of the column used for optimistic locking [wilsonb@gmail.com]
2176
2177 * Don't hardcode 'id' in acts as list. [ror@philippeapril.com]
2178
2179 * Fix date errors for SQLServer in association tests. #3406 [Kevin Clark]
2180
2181 * Escape database name in MySQL adapter when creating and dropping databases. #3409 [anna@wota.jp]
2182
2183 * Disambiguate table names for columns in validates_uniquness_of's WHERE clause. #3423 [alex.borovsky@gmail.com]
2184
2185 * .with_scope imposed create parameters now bypass attr_protected [Tobias Lütke]
2186
2187 * Don't raise an exception when there are more keys than there are named bind variables when sanitizing conditions. [Marcel Molina Jr.]
2188
2189 * Multiple enhancements and adjustments to DB2 adaptor. #3377 [contact@maik-schmidt.de]
2190
2191 * Sanitize scoped conditions. [Marcel Molina Jr.]
2192
2193 * Added option to Base.reflection_of_all_associations to specify a specific association to scope the call. For example Base.reflection_of_all_associations(:has_many) [David Heinemeier Hansson]
2194
2195 * Added ActiveRecord::SchemaDumper.ignore_tables which tells SchemaDumper which tables to ignore. Useful for tables with funky column like the ones required for tsearch2. [Tobias Lütke]
2196
2197 * SchemaDumper now doesn't fail anymore when there are unknown column types in the schema. Instead the table is ignored and a Comment is left in the schema.rb. [Tobias Lütke]
2198
2199 * Fixed that saving a model with multiple habtm associations would only save the first one. #3244 [yanowitz-rubyonrails@quantumfoam.org, Florian Weber]
2200
2201 * Fix change_column to work with PostgreSQL 7.x and 8.x. #3141 [wejn@box.cz, Rick Olson, Scott Barron]
2202
2203 * removed :piggyback in favor of just allowing :select on :through associations. [Tobias Lütke]
2204
2205 * made method missing delegation to class methods on relation target work on :through associations. [Tobias Lütke]
2206
2207 * made .find() work on :through relations. [Tobias Lütke]
2208
2209 * Fix typo in association docs. #3296. [Blair Zajac]
2210
2211 * Fixed :through relations when using STI inherited classes would use the inherited class's name as foreign key on the join model [Tobias Lütke]
2212
2213 *1.13.2* (December 13th, 2005)
2214
2215 * Become part of Rails 1.0
2216
2217 * MySQL: allow encoding option for mysql.rb driver. [Jeremy Kemper]
2218
2219 * Added option inheritance for find calls on has_and_belongs_to_many and has_many assosociations [David Heinemeier Hansson]. Example:
2220
2221 class Post
2222 has_many :recent_comments, :class_name => "Comment", :limit => 10, :include => :author
2223 end
2224
2225 post.recent_comments.find(:all) # Uses LIMIT 10 and includes authors
2226 post.recent_comments.find(:all, :limit => nil) # Uses no limit but include authors
2227 post.recent_comments.find(:all, :limit => nil, :include => nil) # Uses no limit and doesn't include authors
2228
2229 * Added option to specify :group, :limit, :offset, and :select options from find on has_and_belongs_to_many and has_many assosociations [David Heinemeier Hansson]
2230
2231 * MySQL: fixes for the bundled mysql.rb driver. #3160 [Justin Forder]
2232
2233 * SQLServer: fix obscure optimistic locking bug. #3068 [kajism@yahoo.com]
2234
2235 * SQLServer: support uniqueidentifier columns. #2930 [keithm@infused.org]
2236
2237 * SQLServer: cope with tables names qualified by owner. #3067 [jeff@ministrycentered.com]
2238
2239 * SQLServer: cope with columns with "desc" in the name. #1950 [Ron Lusk, Ryan Tomayko]
2240
2241 * SQLServer: cope with primary keys with "select" in the name. #3057 [rdifrango@captechventures.com]
2242
2243 * Oracle: active? performs a select instead of a commit. #3133 [Michael Schoen]
2244
2245 * MySQL: more robust test for nullified result hashes. #3124 [Stefan Kaes]
2246
2247 * Reloading an instance refreshes its aggregations as well as its associations. #3024 [François Beausoleil]
2248
2249 * Fixed that using :include together with :conditions array in Base.find would cause NoMethodError #2887 [Paul Hammmond]
2250
2251 * PostgreSQL: more robust sequence name discovery. #3087 [Rick Olson]
2252
2253 * Oracle: use syntax compatible with Oracle 8. #3131 [Michael Schoen]
2254
2255 * MySQL: work around ruby-mysql/mysql-ruby inconsistency with mysql.stat. Eliminate usage of mysql.ping because it doesn't guarantee reconnect. Explicitly close and reopen the connection instead. [Jeremy Kemper]
2256
2257 * Added preliminary support for polymorphic associations [David Heinemeier Hansson]
2258
2259 * Added preliminary support for join models [David Heinemeier Hansson]
2260
2261 * Allow validate_uniqueness_of to be scoped by more than just one column. #1559. [jeremy@jthopple.com, Marcel Molina Jr.]
2262
2263 * Firebird: active? and reconnect! methods for handling stale connections. #428 [Ken Kunz <kennethkunz@gmail.com>]
2264
2265 * Firebird: updated for FireRuby 0.4.0. #3009 [Ken Kunz <kennethkunz@gmail.com>]
2266
2267 * MySQL and PostgreSQL: active? compatibility with the pure-Ruby driver. #428 [Jeremy Kemper]
2268
2269 * Oracle: active? check pings the database rather than testing the last command status. #428 [Michael Schoen]
2270
2271 * SQLServer: resolve column aliasing/quoting collision when using limit or offset in an eager find. #2974 [kajism@yahoo.com]
2272
2273 * Reloading a model doesn't lose track of its connection. #2996 [junk@miriamtech.com, Jeremy Kemper]
2274
2275 * Fixed bug where using update_attribute after pushing a record to a habtm association of the object caused duplicate rows in the join table. #2888 [colman@rominato.com, Florian Weber, Michael Schoen]
2276
2277 * MySQL, PostgreSQL: reconnect! also reconfigures the connection. Otherwise, the connection 'loses' its settings if it times out and is reconnected. #2978 [Shugo Maeda]
2278
2279 * has_and_belongs_to_many: use JOIN instead of LEFT JOIN. [Jeremy Kemper]
2280
2281 * MySQL: introduce :encoding option to specify the character set for client, connection, and results. Only available for MySQL 4.1 and later with the mysql-ruby driver. Do SHOW CHARACTER SET in mysql client to see available encodings. #2975 [Shugo Maeda]
2282
2283 * Add tasks to create, drop and rebuild the MySQL and PostgreSQL test databases. [Marcel Molina Jr.]
2284
2285 * Correct boolean handling in generated reader methods. #2945 [Don Park, Stefan Kaes]
2286
2287 * Don't generate read methods for columns whose names are not valid ruby method names. #2946 [Stefan Kaes]
2288
2289 * Document :force option to create_table. #2921 [Blair Zajac <blair@orcaware.com>]
2290
2291 * Don't add the same conditions twice in has_one finder sql. #2916 [Jeremy Evans]
2292
2293 * Rename Version constant to VERSION. #2802 [Marcel Molina Jr.]
2294
2295 * Introducing the Firebird adapter. Quote columns and use attribute_condition more consistently. Setup guide: http://wiki.rubyonrails.com/rails/pages/Firebird+Adapter #1874 [Ken Kunz <kennethkunz@gmail.com>]
2296
2297 * SQLServer: active? and reconnect! methods for handling stale connections. #428 [kajism@yahoo.com, Tom Ward <tom@popdog.net>]
2298
2299 * Associations handle case-equality more consistently: item.parts.is_a?(Array) and item.parts === Array. #1345 [MarkusQ@reality.com]
2300
2301 * SQLServer: insert uses given primary key value if not nil rather than SELECT @@IDENTITY. #2866 [kajism@yahoo.com, Tom Ward <tom@popdog.net>]
2302
2303 * Oracle: active? and reconnect! methods for handling stale connections. Optionally retry queries after reconnect. #428 [Michael Schoen <schoenm@earthlink.net>]
2304
2305 * Correct documentation for Base.delete_all. #1568 [Newhydra]
2306
2307 * Oracle: test case for column default parsing. #2788 [Michael Schoen <schoenm@earthlink.net>]
2308
2309 * Update documentation for Migrations. #2861 [Tom Werner <tom@cube6media.com>]
2310
2311 * When AbstractAdapter#log rescues an exception, attempt to detect and reconnect to an inactive database connection. Connection adapter must respond to the active? and reconnect! instance methods. Initial support for PostgreSQL, MySQL, and SQLite. Make certain that all statements which may need reconnection are performed within a logged block: for example, this means no avoiding log(sql, name) { } if @logger.nil? #428 [Jeremy Kemper]
2312
2313 * Oracle: Much faster column reflection. #2848 [Michael Schoen <schoenm@earthlink.net>]
2314
2315 * Base.reset_sequence_name analogous to reset_table_name (mostly useful for testing). Base.define_attr_method allows nil values. [Jeremy Kemper]
2316
2317 * PostgreSQL: smarter sequence name defaults, stricter last_insert_id, warn on pk without sequence. [Jeremy Kemper]
2318
2319 * PostgreSQL: correctly discover custom primary key sequences. #2594 [Blair Zajac <blair@orcaware.com>, meadow.nnick@gmail.com, Jeremy Kemper]
2320
2321 * SQLServer: don't report limits for unsupported field types. #2835 [Ryan Tomayko]
2322
2323 * Include the Enumerable module in ActiveRecord::Errors. [Rick Bradley <rick@rickbradley.com>]
2324
2325 * Add :group option, correspond to GROUP BY, to the find method and to the has_many association. #2818 [rubyonrails@atyp.de]
2326
2327 * Don't cast nil or empty strings to a dummy date. #2789 [Rick Bradley <rick@rickbradley.com>]
2328
2329 * acts_as_list plays nicely with inheritance by remembering the class which declared it. #2811 [rephorm@rephorm.com]
2330
2331 * Fix sqlite adaptor's detection of missing dbfile or database declaration. [Nicholas Seckar]
2332
2333 * Fixed acts_as_list for definitions without an explicit :order #2803 [Jonathan Viney]
2334
2335 * Upgrade bundled ruby-mysql 0.2.4 with mysql411 shim (see #440) to ruby-mysql 0.2.6 with a patchset for 4.1 protocol support. Local change [301] is now a part of the main driver; reapplied local change [2182]. Removed GC.start from Result.free. [tommy@tmtm.org, akuroda@gmail.com, Doug Fales <doug.fales@gmail.com>, Jeremy Kemper]
2336
2337 * Correct handling of complex order clauses with SQL Server limit emulation. #2770 [Tom Ward <tom@popdog.net>, Matt B.]
2338
2339 * Correct whitespace problem in Oracle default column value parsing. #2788 [rick@rickbradley.com]
2340
2341 * Destroy associated has_and_belongs_to_many records after all before_destroy callbacks but before destroy. This allows you to act on the habtm association as you please while preserving referential integrity. #2065 [larrywilliams1@gmail.com, sam.kirchmeier@gmail.com, elliot@townx.org, Jeremy Kemper]
2342
2343 * Deprecate the old, confusing :exclusively_dependent option in favor of :dependent => :delete_all. [Jeremy Kemper]
2344
2345 * More compatible Oracle column reflection. #2771 [Ryan Davis <ryand-ruby@zenspider.com>, Michael Schoen <schoenm@earthlink.net>]
2346
2347
2348 *1.13.0* (November 7th, 2005)
2349
2350 * Fixed faulty regex in get_table_name method (SQLServerAdapter) #2639 [Ryan Tomayko]
2351
2352 * Added :include as an option for association declarations [David Heinemeier Hansson]. Example:
2353
2354 has_many :posts, :include => [ :author, :comments ]
2355
2356 * Rename Base.constrain to Base.with_scope so it doesn't conflict with existing concept of database constraints. Make scoping more robust: uniform method => parameters, validated method names and supported finder parameters, raise exception on nested scopes. [Jeremy Kemper] Example:
2357
2358 Comment.with_scope(:find => { :conditions => 'active=true' }, :create => { :post_id => 5 }) do
2359 # Find where name = ? and active=true
2360 Comment.find :all, :conditions => ['name = ?', name]
2361 # Create comment associated with :post_id
2362 Comment.create :body => "Hello world"
2363 end
2364
2365 * Fixed that SQL Server should ignore :size declarations on anything but integer and string in the agnostic schema representation #2756 [Ryan Tomayko]
2366
2367 * Added constrain scoping for creates using a hash of attributes bound to the :creation key [David Heinemeier Hansson]. Example:
2368
2369 Comment.constrain(:creation => { :post_id => 5 }) do
2370 # Associated with :post_id
2371 Comment.create :body => "Hello world"
2372 end
2373
2374 This is rarely used directly, but allows for find_or_create on associations. So you can do:
2375
2376 # If the tag doesn't exist, a new one is created that's associated with the person
2377 person.tags.find_or_create_by_name("Summer")
2378
2379 * Added find_or_create_by_X as a second type of dynamic finder that'll create the record if it doesn't already exist [David Heinemeier Hansson]. Example:
2380
2381 # No 'Summer' tag exists
2382 Tag.find_or_create_by_name("Summer") # equal to Tag.create(:name => "Summer")
2383
2384 # Now the 'Summer' tag does exist
2385 Tag.find_or_create_by_name("Summer") # equal to Tag.find_by_name("Summer")
2386
2387 * Added extension capabilities to has_many and has_and_belongs_to_many proxies [David Heinemeier Hansson]. Example:
2388
2389 class Account < ActiveRecord::Base
2390 has_many :people do
2391 def find_or_create_by_name(name)
2392 first_name, *last_name = name.split
2393 last_name = last_name.join " "
2394
2395 find_or_create_by_first_name_and_last_name(first_name, last_name)
2396 end
2397 end
2398 end
2399
2400 person = Account.find(:first).people.find_or_create_by_name("David Heinemeier Hansson")
2401 person.first_name # => "David"
2402 person.last_name # => "Heinemeier Hansson"
2403
2404 Note that the anoymous module must be declared using brackets, not do/end (due to order of evaluation).
2405
2406 * Omit internal dtproperties table from SQLServer table list. #2729 [Ryan Tomayko]
2407
2408 * Quote column names in generated SQL. #2728 [Ryan Tomayko]
2409
2410 * Correct the pure-Ruby MySQL 4.1.1 shim's version test. #2718 [Jeremy Kemper]
2411
2412 * Add Model.create! to match existing model.save! method. When save! raises RecordInvalid, you can catch the exception, retrieve the invalid record (invalid_exception.record), and see its errors (invalid_exception.record.errors). [Jeremy Kemper]
2413
2414 * Correct fixture behavior when table name pluralization is off. #2719 [Rick Bradley <rick@rickbradley.com>]
2415
2416 * Changed :dbfile to :database for SQLite adapter for consistency (old key still works as an alias) #2644 [Dan Peterson]
2417
2418 * Added migration support for Oracle #2647 [Michael Schoen]
2419
2420 * Worked around that connection can't be reset if allow_concurrency is off. #2648 [Michael Schoen <schoenm@earthlink.net>]
2421
2422 * Fixed SQL Server adapter to pass even more tests and do even better #2634 [Ryan Tomayko]
2423
2424 * Fixed SQL Server adapter so it honors options[:conditions] when applying :limits #1978 [Tom Ward]
2425
2426 * Added migration support to SQL Server adapter (please someone do the same for Oracle and DB2) #2625 [Tom Ward]
2427
2428 * Use AR::Base.silence rather than AR::Base.logger.silence in fixtures to preserve Log4r compatibility. #2618 [dansketcher@gmail.com]
2429
2430 * Constraints are cloned so they can't be inadvertently modified while they're
2431 in effect. Added :readonly finder constraint. Calling an association collection's class method (Part.foobar via item.parts.foobar) constrains :readonly => false since the collection's :joins constraint would otherwise force it to true. [Jeremy Kemper <rails@bitsweat.net>]
2432
2433 * Added :offset and :limit to the kinds of options that Base.constrain can use #2466 [duane.johnson@gmail.com]
2434
2435 * Fixed handling of nil number columns on Oracle and cleaned up tests for Oracle in general #2555 [Michael Schoen]
2436
2437 * Added quoted_true and quoted_false methods and tables to db2_adapter and cleaned up tests for DB2 #2493, #2624 [maik schmidt]
2438
2439
2440 *1.12.2* (October 26th, 2005)
2441
2442 * Allow symbols to rename columns when using SQLite adapter. #2531 [Kevin Clark]
2443
2444 * Map Active Record time to SQL TIME. #2575, #2576 [Robby Russell <robby@planetargon.com>]
2445
2446 * Clarify semantics of ActiveRecord::Base#respond_to? #2560 [Stefan Kaes]
2447
2448 * Fixed Association#clear for associations which have not yet been accessed. #2524 [Patrick Lenz <patrick@lenz.sh>]
2449
2450 * HABTM finders shouldn't return readonly records. #2525 [Patrick Lenz <patrick@lenz.sh>]
2451
2452 * Make all tests runnable on their own. #2521. [Blair Zajac <blair@orcaware.com>]
2453
2454
2455 *1.12.1* (October 19th, 2005)
2456
2457 * Always parenthesize :conditions options so they may be safely combined with STI and constraints.
2458
2459 * Correct PostgreSQL primary key sequence detection. #2507 [tmornini@infomania.com]
2460
2461 * Added support for using limits in eager loads that involve has_many and has_and_belongs_to_many associations
2462
2463
2464 *1.12.0* (October 16th, 2005)
2465
2466 * Update/clean up documentation (rdoc)
2467
2468 * PostgreSQL sequence support. Use set_sequence_name in your model class to specify its primary key sequence. #2292 [Rick Olson <technoweenie@gmail.com>, Robby Russell <robby@planetargon.com>]
2469
2470 * Change default logging colors to work on both white and black backgrounds. [Sam Stephenson]
2471
2472 * YAML fixtures support ordered hashes for fixtures with foreign key dependencies in the same table. #1896 [purestorm@ggnore.net]
2473
2474 * :dependent now accepts :nullify option. Sets the foreign key of the related objects to NULL instead of deleting them. #2015 [Robby Russell <robby@planetargon.com>]
2475
2476 * Introduce read-only records. If you call object.readonly! then it will mark the object as read-only and raise ReadOnlyRecord if you call object.save. object.readonly? reports whether the object is read-only. Passing :readonly => true to any finder method will mark returned records as read-only. The :joins option now implies :readonly, so if you use this option, saving the same record will now fail. Use find_by_sql to work around.
2477
2478 * Avoid memleak in dev mode when using fcgi
2479
2480 * Simplified .clear on active record associations by using the existing delete_records method. #1906 [Caleb <me@cpb.ca>]
2481
2482 * Delegate access to a customized primary key to the conventional id method. #2444. [Blair Zajac <blair@orcaware.com>]
2483
2484 * Fix errors caused by assigning a has-one or belongs-to property to itself
2485
2486 * Add ActiveRecord::Base.schema_format setting which specifies how databases should be dumped [Sam Stephenson]
2487
2488 * Update DB2 adapter. #2206. [contact@maik-schmidt.de]
2489
2490 * Corrections to SQLServer native data types. #2267. [rails.20.clarry@spamgourmet.com]
2491
2492 * Deprecated ActiveRecord::Base.threaded_connection in favor of ActiveRecord::Base.allow_concurrency.
2493
2494 * Protect id attribute from mass assigment even when the primary key is set to something else. #2438. [Blair Zajac <blair@orcaware.com>]
2495
2496 * Misc doc fixes (typos/grammar/etc.). #2430. [coffee2code]
2497
2498 * Add test coverage for content_columns. #2432. [coffee2code]
2499
2500 * Speed up for unthreaded environments. #2431. [Stefan Kaes]
2501
2502 * Optimization for Mysql selects using mysql-ruby extension greater than 2.6.3. #2426. [Stefan Kaes]
2503
2504 * Speed up the setting of table_name. #2428. [Stefan Kaes]
2505
2506 * Optimize instantiation of STI subclass records. In partial fullfilment of #1236. [Stefan Kaes]
2507
2508 * Fix typo of 'constrains' to 'contraints'. #2069. [Michael Schuerig <michael@schuerig.de>]
2509
2510 * Optimization refactoring for add_limit_offset!. In partial fullfilment of #1236. [Stefan Kaes]
2511
2512 * Add ability to get all siblings, including the current child, with acts_as_tree. Recloses #2140. [Michael Schuerig <michael@schuerig.de>]
2513
2514 * Add geometric type for postgresql adapter. #2233 [Andrew Kaspick]
2515
2516 * Add option (true by default) to generate reader methods for each attribute of a record to avoid the overhead of calling method missing. In partial fullfilment of #1236. [Stefan Kaes]
2517
2518 * Add convenience predicate methods on Column class. In partial fullfilment of #1236. [Stefan Kaes]
2519
2520 * Raise errors when invalid hash keys are passed to ActiveRecord::Base.find. #2363 [Chad Fowler <chad@chadfowler.com>, Nicholas Seckar]
2521
2522 * Added :force option to create_table that'll try to drop the table if it already exists before creating
2523
2524 * Fix transactions so that calling return while inside a transaction will not leave an open transaction on the connection. [Nicholas Seckar]
2525
2526 * Use foreign_key inflection uniformly. #2156 [Blair Zajac <blair@orcaware.com>]
2527
2528 * model.association.clear should destroy associated objects if :dependent => true instead of nullifying their foreign keys. #2221 [joergd@pobox.com, ObieFernandez <obiefernandez@gmail.com>]
2529
2530 * Returning false from before_destroy should cancel the action. #1829 [Jeremy Huffman]
2531
2532 * Recognize PostgreSQL NOW() default as equivalent to CURRENT_TIMESTAMP or CURRENT_DATE, depending on the column's type. #2256 [mat <mat@absolight.fr>]
2533
2534 * Extensive documentation for the abstract database adapter. #2250 [François Beausoleil <fbeausoleil@ftml.net>]
2535
2536 * Clean up Fixtures.reset_sequences for PostgreSQL. Handle tables with no rows and models with custom primary keys. #2174, #2183 [jay@jay.fm, Blair Zajac <blair@orcaware.com>]
2537
2538 * Improve error message when nil is assigned to an attr which validates_size_of within a range. #2022 [Manuel Holtgrewe <purestorm@ggnore.net>]
2539
2540 * Make update_attribute use the same writer method that update_attributes uses.
2541 #2237 [trevor@protocool.com]
2542
2543 * Make migrations honor table name prefixes and suffixes. #2298 [Jakob Skjerning, Marcel Molina Jr.]
2544
2545 * Correct and optimize PostgreSQL bytea escaping. #1745, #1837 [dave@cherryville.org, ken@miriamtech.com, bellis@deepthought.org]
2546
2547 * Fixtures should only reset a PostgreSQL sequence if it corresponds to an integer primary key named id. #1749 [chris@chrisbrinker.com]
2548
2549 * Standardize the interpretation of boolean columns in the Mysql and Sqlite adapters. (Use MysqlAdapter.emulate_booleans = false to disable this behavior)
2550
2551 * Added new symbol-driven approach to activating observers with Base#observers= [David Heinemeier Hansson]. Example:
2552
2553 ActiveRecord::Base.observers = :cacher, :garbage_collector
2554
2555 * Added AbstractAdapter#select_value and AbstractAdapter#select_values as convenience methods for selecting single values, instead of hashes, of the first column in a SELECT #2283 [solo@gatelys.com]
2556
2557 * Wrap :conditions in parentheses to prevent problems with OR's #1871 [Jamis Buck]
2558
2559 * Allow the postgresql adapter to work with the SchemaDumper. [Jamis Buck]
2560
2561 * Add ActiveRecord::SchemaDumper for dumping a DB schema to a pure-ruby file, making it easier to consolidate large migration lists and port database schemas between databases. [Jamis Buck]
2562
2563 * Fixed migrations for Windows when using more than 10 [David Naseby]
2564
2565 * Fixed that the create_x method from belongs_to wouldn't save the association properly #2042 [Florian Weber]
2566
2567 * Fixed saving a record with two unsaved belongs_to associations pointing to the same object #2023 [Tobias Lütke]
2568
2569 * Improved migrations' behavior when the schema_info table is empty. [Nicholas Seckar]
2570
2571 * Fixed that Observers didn't observe sub-classes #627 [Florian Weber]
2572
2573 * Fix eager loading error messages, allow :include to specify tables using strings or symbols. Closes #2222 [Marcel Molina Jr.]
2574
2575 * Added check for RAILS_CONNECTION_ADAPTERS on startup and only load the connection adapters specified within if its present (available in Rails through config.connection_adapters using the new config) #1958 [skae]
2576
2577 * Fixed various problems with has_and_belongs_to_many when using customer finder_sql #2094 [Florian Weber]
2578
2579 * Added better exception error when unknown column types are used with migrations #1814 [François Beausoleil]
2580
2581 * Fixed "connection lost" issue with the bundled Ruby/MySQL driver (would kill the app after 8 hours of inactivity) #2163, #428 [kajism@yahoo.com]
2582
2583 * Fixed comparison of Active Record objects so two new objects are not equal #2099 [deberg]
2584
2585 * Fixed that the SQL Server adapter would sometimes return DBI::Timestamp objects instead of Time #2127 [Tom Ward]
2586
2587 * Added the instance methods #root and #ancestors on acts_as_tree and fixed siblings to not include the current node #2142, #2140 [coffee2code]
2588
2589 * Fixed that Active Record would call SHOW FIELDS twice (or more) for the same model when the cached results were available #1947 [sd@notso.net]
2590
2591 * Added log_level and use_silence parameter to ActiveRecord::Base.benchmark. The first controls at what level the benchmark statement will be logged (now as debug, instead of info) and the second that can be passed false to include all logging statements during the benchmark block/
2592
2593 * Make sure the schema_info table is created before querying the current version #1903
2594
2595 * Fixtures ignore table name prefix and suffix #1987 [Jakob Skjerning]
2596
2597 * Add documentation for index_type argument to add_index method for migrations #2005 [Blaine]
2598
2599 * Modify read_attribute to allow a symbol argument #2024 [Ken Kunz]
2600
2601 * Make destroy return self #1913 [Sebastian Kanthak]
2602
2603 * Fix typo in validations documentation #1938 [court3nay]
2604
2605 * Make acts_as_list work for insert_at(1) #1966 [hensleyl@papermountain.org]
2606
2607 * Fix typo in count_by_sql documentation #1969 [Alexey Verkhovsky]
2608
2609 * Allow add_column and create_table to specify NOT NULL #1712 [emptysands@gmail.com]
2610
2611 * Fix create_table so that id column is implicitly added [Rick Olson]
2612
2613 * Default sequence names for Oracle changed to #{table_name}_seq, which is the most commonly used standard. In addition, a new method ActiveRecord::Base#set_sequence_name allows the developer to set the sequence name per model. This is a non-backwards-compatible change -- anyone using the old-style "rails_sequence" will need to either create new sequences, or set: ActiveRecord::Base.set_sequence_name = "rails_sequence" #1798
2614
2615 * OCIAdapter now properly handles synonyms, which are commonly used to separate out the schema owner from the application user #1798
2616
2617 * Fixed the handling of camelCase columns names in Oracle #1798
2618
2619 * Implemented for OCI the Rakefile tasks of :clone_structure_to_test, :db_structure_dump, and :purge_test_database, which enable Oracle folks to enjoy all the agile goodness of Rails for testing. Note that the current implementation is fairly limited -- only tables and sequences are cloned, not constraints or indexes. A full clone in Oracle generally requires some manual effort, and is version-specific. Post 9i, Oracle recommends the use of the DBMS_METADATA package, though that approach requires editing of the physical characteristics generated #1798
2620
2621 * Fixed the handling of multiple blob columns in Oracle if one or more of them are null #1798
2622
2623 * Added support for calling constrained class methods on has_many and has_and_belongs_to_many collections #1764 [Tobias Lütke]
2624
2625 class Comment < AR:B
2626 def self.search(q)
2627 find(:all, :conditions => ["body = ?", q])
2628 end
2629 end
2630
2631 class Post < AR:B
2632 has_many :comments
2633 end
2634
2635 Post.find(1).comments.search('hi') # => SELECT * from comments WHERE post_id = 1 AND body = 'hi'
2636
2637 NOTICE: This patch changes the underlying SQL generated by has_and_belongs_to_many queries. If your relying on that, such as
2638 by explicitly referencing the old t and j aliases, you'll need to update your code. Of course, you _shouldn't_ be relying on
2639 details like that no less than you should be diving in to touch private variables. But just in case you do, consider yourself
2640 noticed :)
2641
2642 * Added migration support for SQLite (using temporary tables to simulate ALTER TABLE) #1771 [Sam Stephenson]
2643
2644 * Remove extra definition of supports_migrations? from abstract_adaptor.rb [Nicholas Seckar]
2645
2646 * Fix acts_as_list so that moving next-to-last item to the bottom does not result in duplicate item positions
2647
2648 * Fixed incompatibility in DB2 adapter with the new limit/offset approach #1718 [Maik Schmidt]
2649
2650 * Added :select option to find which can specify a different value than the default *, like find(:all, :select => "first_name, last_name"), if you either only want to select part of the columns or exclude columns otherwise included from a join #1338 [Stefan Kaes]
2651
2652
2653 *1.11.1* (11 July, 2005)
2654
2655 * Added support for limit and offset with eager loading of has_one and belongs_to associations. Using the options with has_many and has_and_belongs_to_many associations will now raise an ActiveRecord::ConfigurationError #1692 [Rick Olson]
2656
2657 * Fixed that assume_bottom_position (in acts_as_list) could be called on items already last in the list and they would move one position away from the list #1648 [tyler@kianta.com]
2658
2659 * Added ActiveRecord::Base.threaded_connections flag to turn off 1-connection per thread (required for thread safety). By default it's on, but WEBrick in Rails need it off #1685 [Sam Stephenson]
2660
2661 * Correct reflected table name for singular associations. #1688 [court3nay]
2662
2663 * Fixed optimistic locking with SQL Server #1660 [tom@popdog.net]
2664
2665 * Added ActiveRecord::Migrator.migrate that can figure out whether to go up or down based on the target version and the current
2666
2667 * Added better error message for "packets out of order" #1630 [court3nay]
2668
2669 * Fixed first run of "rake migrate" on PostgreSQL by not expecting a return value on the id #1640
2670
2671
2672 *1.11.0* (6 July, 2005)
2673
2674 * Fixed that Yaml error message in fixtures hid the real error #1623 [Nicholas Seckar]
2675
2676 * Changed logging of SQL statements to use the DEBUG level instead of INFO
2677
2678 * Added new Migrations framework for describing schema transformations in a way that can be easily applied across multiple databases #1604 [Tobias Lütke] See documentation under ActiveRecord::Migration and the additional support in the Rails rakefile/generator.
2679
2680 * Added callback hooks to association collections #1549 [Florian Weber]. Example:
2681
2682 class Project
2683 has_and_belongs_to_many :developers, :before_add => :evaluate_velocity
2684
2685 def evaluate_velocity(developer)
2686 ...
2687 end
2688 end
2689
2690 ..raising an exception will cause the object not to be added (or removed, with before_remove).
2691
2692
2693 * Fixed Base.content_columns call for SQL Server adapter #1450 [DeLynn Berry]
2694
2695 * Fixed Base#write_attribute to work with both symbols and strings #1190 [Paul Legato]
2696
2697 * Fixed that has_and_belongs_to_many didn't respect single table inheritance types #1081 [Florian Weber]
2698
2699 * Speed up ActiveRecord#method_missing for the common case (read_attribute).
2700
2701 * Only notify observers on after_find and after_initialize if these methods are defined on the model. #1235 [Stefan Kaes]
2702
2703 * Fixed that single-table inheritance sub-classes couldn't be used to limit the result set with eager loading #1215 [Chris McGrath]
2704
2705 * Fixed validates_numericality_of to work with overrided getter-method when :allow_nil is on #1316 [raidel@onemail.at]
2706
2707 * Added roots, root, and siblings to the batch of methods added by acts_as_tree #1541 [Michael Schuerig]
2708
2709 * Added support for limit/offset with the MS SQL Server driver so that pagination will now work #1569 [DeLynn Berry]
2710
2711 * Added support for ODBC connections to MS SQL Server so you can connect from a non-Windows machine #1569 [Mark Imbriaco/DeLynn Berry]
2712
2713 * Fixed that multiparameter posts ignored attr_protected #1532 [alec+rails@veryclever.net]
2714
2715 * Fixed problem with eager loading when using a has_and_belongs_to_many association using :association_foreign_key #1504 [flash@vanklinkenbergsoftware.nl]
2716
2717 * Fixed Base#find to honor the documentation on how :joins work and make them consistent with Base#count #1405 [pritchie@gmail.com]. What used to be:
2718
2719 Developer.find :all, :joins => 'developers_projects', :conditions => 'id=developer_id AND project_id=1'
2720
2721 ...should instead be:
2722
2723 Developer.find(
2724 :all,
2725 :joins => 'LEFT JOIN developers_projects ON developers.id = developers_projects.developer_id',
2726 :conditions => 'project_id=1'
2727 )
2728
2729 * Fixed that validations didn't respecting custom setting for too_short, too_long messages #1437 [Marcel Molina Jr.]
2730
2731 * Fixed that clear_association_cache doesn't delete new associations on new records (so you can safely place new records in the session with Action Pack without having new associations wiped) #1494 [cluon]
2732
2733 * Fixed that calling Model.find([]) returns [] and doesn't throw an exception #1379
2734
2735 * Fixed that adding a record to a has_and_belongs_to collection would always save it -- now it only saves if its a new record #1203 [Alisdair McDiarmid]
2736
2737 * Fixed saving of in-memory association structures to happen as a after_create/after_update callback instead of after_save -- that way you can add new associations in after_create/after_update callbacks without getting them saved twice
2738
2739 * Allow any Enumerable, not just Array, to work as bind variables #1344 [Jeremy Kemper]
2740
2741 * Added actual database-changing behavior to collection assigment for has_many and has_and_belongs_to_many #1425 [Sebastian Kanthak].
2742 Example:
2743
2744 david.projects = [Project.find(1), Project.new("name" => "ActionWebSearch")]
2745 david.save
2746
2747 If david.projects already contain the project with ID 1, this is left unchanged. Any other projects are dropped. And the new
2748 project is saved when david.save is called.
2749
2750 Also included is a way to do assignments through IDs, which is perfect for checkbox updating, so you get to do:
2751
2752 david.project_ids = [1, 5, 7]
2753
2754 * Corrected typo in find SQL for has_and_belongs_to_many. #1312 [ben@bensinclair.com]
2755
2756 * Fixed sanitized conditions for has_many finder method. #1281 [jackc@hylesanderson.com, pragdave, Tobias Lütke]
2757
2758 * Comprehensive PostgreSQL schema support. Use the optional schema_search_path directive in database.yml to give a comma-separated list of schemas to search for your tables. This allows you, for example, to have tables in a shared schema without having to use a custom table name. See http://www.postgresql.org/docs/8.0/interactive/ddl-schemas.html to learn more. #827 [dave@cherryville.org]
2759
2760 * Corrected @@configurations typo #1410 [david@ruppconsulting.com]
2761
2762 * Return PostgreSQL columns in the order they were declared #1374 [perlguy@gmail.com]
2763
2764 * Allow before/after update hooks to work on models using optimistic locking
2765
2766 * Eager loading of dependent has_one associations won't delete the association #1212
2767
2768 * Added a second parameter to the build and create method for has_one that controls whether the existing association should be replaced (which means nullifying its foreign key as well). By default this is true, but false can be passed to prevent it.
2769
2770 * Using transactional fixtures now causes the data to be loaded only once.
2771
2772 * Added fixture accessor methods that can be used when instantiated fixtures are disabled.
2773
2774 fixtures :web_sites
2775
2776 def test_something
2777 assert_equal "Ruby on Rails", web_sites(:rubyonrails).name
2778 end
2779
2780 * Added DoubleRenderError exception that'll be raised if render* is called twice #518 [Nicholas Seckar]
2781
2782 * Fixed exceptions occuring after render has been called #1096 [Nicholas Seckar]
2783
2784 * CHANGED: validates_presence_of now uses Errors#add_on_blank, which will make " " fail the validation where it didn't before #1309
2785
2786 * Added Errors#add_on_blank which works like Errors#add_on_empty, but uses Object#blank? instead
2787
2788 * Added the :if option to all validations that can either use a block or a method pointer to determine whether the validation should be run or not. #1324 [Duane Johnson/jhosteny]. Examples:
2789
2790 Conditional validations such as the following are made possible:
2791 validates_numericality_of :income, :if => :employed?
2792
2793 Conditional validations can also solve the salted login generator problem:
2794 validates_confirmation_of :password, :if => :new_password?
2795
2796 Using blocks:
2797 validates_presence_of :username, :if => Proc.new { |user| user.signup_step > 1 }
2798
2799 * Fixed use of construct_finder_sql when using :join #1288 [dwlt@dwlt.net]
2800
2801 * Fixed that :delete_sql in has_and_belongs_to_many associations couldn't access record properties #1299 [Rick Olson]
2802
2803 * Fixed that clone would break when an aggregate had the same name as one of its attributes #1307 [Jeremy Kemper]
2804
2805 * Changed that destroying an object will only freeze the attributes hash, which keeps the object from having attributes changed (as that wouldn't make sense), but allows for the querying of associations after it has been destroyed.
2806
2807 * Changed the callbacks such that observers are notified before the in-object callbacks are triggered. Without this change, it wasn't possible to act on the whole object in something like a before_destroy observer without having the objects own callbacks (like deleting associations) called first.
2808
2809 * Added option for passing an array to the find_all version of the dynamic finders and have it evaluated as an IN fragment. Example:
2810
2811 # SELECT * FROM topics WHERE title IN ('First', 'Second')
2812 Topic.find_all_by_title(["First", "Second"])
2813
2814 * Added compatibility with camelCase column names for dynamic finders #533 [Dee Zsombor]
2815
2816 * Fixed extraneous comma in count() function that made it not work with joins #1156 [Jarkko Laine/Dee Zsombor]
2817
2818 * Fixed incompatibility with Base#find with an array of ids that would fail when using eager loading #1186 [Alisdair McDiarmid]
2819
2820 * Fixed that validate_length_of lost :on option when :within was specified #1195 [jhosteny@mac.com]
2821
2822 * Added encoding and min_messages options for PostgreSQL #1205 [Shugo Maeda]. Configuration example:
2823
2824 development:
2825 adapter: postgresql
2826 database: rails_development
2827 host: localhost
2828 username: postgres
2829 password:
2830 encoding: UTF8
2831 min_messages: ERROR
2832
2833 * Fixed acts_as_list where deleting an item that was removed from the list would ruin the positioning of other list items #1197 [Jamis Buck]
2834
2835 * Added validates_exclusion_of as a negative of validates_inclusion_of
2836
2837 * Optimized counting of has_many associations by setting the association to empty if the count is 0 so repeated calls doesn't trigger database calls
2838
2839
2840 *1.10.1* (20th April, 2005)
2841
2842 * Fixed frivilous database queries being triggered with eager loading on empty associations and other things
2843
2844 * Fixed order of loading in eager associations
2845
2846 * Fixed stray comma when using eager loading and ordering together from has_many associations #1143
2847
2848
2849 *1.10.0* (19th April, 2005)
2850
2851 * Added eager loading of associations as a way to solve the N+1 problem more gracefully without piggy-back queries. Example:
2852
2853 for post in Post.find(:all, :limit => 100)
2854 puts "Post: " + post.title
2855 puts "Written by: " + post.author.name
2856 puts "Last comment on: " + post.comments.first.created_on
2857 end
2858
2859 This used to generate 301 database queries if all 100 posts had both author and comments. It can now be written as:
2860
2861 for post in Post.find(:all, :limit => 100, :include => [ :author, :comments ])
2862
2863 ...and the number of database queries needed is now 1.
2864
2865 * Added new unified Base.find API and deprecated the use of find_first and find_all. See the documentation for Base.find. Examples:
2866
2867 Person.find(1, :conditions => "administrator = 1", :order => "created_on DESC")
2868 Person.find(1, 5, 6, :conditions => "administrator = 1", :order => "created_on DESC")
2869 Person.find(:first, :order => "created_on DESC", :offset => 5)
2870 Person.find(:all, :conditions => [ "category IN (?)", categories], :limit => 50)
2871 Person.find(:all, :offset => 10, :limit => 10)
2872
2873 * Added acts_as_nested_set #1000 [wschenk]. Introduction:
2874
2875 This acts provides Nested Set functionality. Nested Set is similiar to Tree, but with
2876 the added feature that you can select the children and all of it's descendants with
2877 a single query. A good use case for this is a threaded post system, where you want
2878 to display every reply to a comment without multiple selects.
2879
2880 * Added Base.save! that attempts to save the record just like Base.save but will raise a RecordInvalid exception instead of returning false if the record is not valid [Dave Thomas]
2881
2882 * Fixed PostgreSQL usage of fixtures with regards to public schemas and table names with dots #962 [gnuman1@gmail.com]
2883
2884 * Fixed that fixtures were being deleted in the same order as inserts causing FK errors #890 [andrew.john.peters@gmail.com]
2885
2886 * Fixed loading of fixtures in to be in the right order (or PostgreSQL would bark) #1047 [stephenh@chase3000.com]
2887
2888 * Fixed page caching for non-vhost applications living underneath the root #1004 [Ben Schumacher]
2889
2890 * Fixes a problem with the SQL Adapter which was resulting in IDENTITY_INSERT not being set to ON when it should be #1104 [adelle]
2891
2892 * Added the option to specify the acceptance string in validates_acceptance_of #1106 [caleb@aei-tech.com]
2893
2894 * Added insert_at(position) to acts_as_list #1083 [DeLynnB]
2895
2896 * Removed the default order by id on has_and_belongs_to_many queries as it could kill performance on large sets (you can still specify by hand with :order)
2897
2898 * Fixed that Base.silence should restore the old logger level when done, not just set it to DEBUG #1084 [yon@milliped.com]
2899
2900 * Fixed boolean saving on Oracle #1093 [mparrish@pearware.org]
2901
2902 * Moved build_association and create_association for has_one and belongs_to out of deprecation as they work when the association is nil unlike association.build and association.create, which require the association to be already in place #864
2903
2904 * Added rollbacks of transactions if they're active as the dispatcher is killed gracefully (TERM signal) #1054 [Leon Bredt]
2905
2906 * Added quoting of column names for fixtures #997 [jcfischer@gmail.com]
2907
2908 * Fixed counter_sql when no records exist in database for PostgreSQL (would give error, not 0) #1039 [Caleb Tennis]
2909
2910 * Fixed that benchmarking times for rendering included db runtimes #987 [Stefan Kaes]
2911
2912 * Fixed boolean queries for t/f fields in PostgreSQL #995 [dave@cherryville.org]
2913
2914 * Added that model.items.delete(child) will delete the child, not just set the foreign key to nil, if the child is dependent on the model #978 [Jeremy Kemper]
2915
2916 * Fixed auto-stamping of dates (created_on/updated_on) for PostgreSQL #985 [dave@cherryville.org]
2917
2918 * Fixed Base.silence/benchmark to only log if a logger has been configured #986 [Stefan Kaes]
2919
2920 * Added a join parameter as the third argument to Base.find_first and as the second to Base.count #426, #988 [Stefan Kaes]
2921
2922 * Fixed bug in Base#hash method that would treat records with the same string-based id as different [Dave Thomas]
2923
2924 * Renamed DateHelper#distance_of_time_in_words_to_now to DateHelper#time_ago_in_words (old method name is still available as a deprecated alias)
2925
2926
2927 *1.9.1* (27th March, 2005)
2928
2929 * Fixed that Active Record objects with float attribute could not be cloned #808
2930
2931 * Fixed that MissingSourceFile's wasn't properly detected in production mode #925 [Nicholas Seckar]
2932
2933 * Fixed that :counter_cache option would look for a line_items_count column for a LineItem object instead of lineitems_count
2934
2935 * Fixed that AR exists?() would explode on postgresql if the passed id did not match the PK type #900 [Scott Barron]
2936
2937 * Fixed the MS SQL adapter to work with the new limit/offset approach and with binary data (still suffering from 7KB limit, though) #901 [delynnb]
2938
2939
2940 *1.9.0* (22th March, 2005)
2941
2942 * Added adapter independent limit clause as a two-element array with the first being the limit, the second being the offset #795 [Sam Stephenson]. Example:
2943
2944 Developer.find_all nil, 'id ASC', 5 # return the first five developers
2945 Developer.find_all nil, 'id ASC', [3, 8] # return three developers, starting from #8 and forward
2946
2947 This doesn't yet work with the DB2 or MS SQL adapters. Patches to make that happen are encouraged.
2948
2949 * Added alias_method :to_param, :id to Base, such that Active Record objects to be used as URL parameters in Action Pack automatically #812 [Nicholas Seckar/Sam Stephenson]
2950
2951 * Improved the performance of the OCI8 adapter for Oracle #723 [pilx/gjenkins]
2952
2953 * Added type conversion before saving a record, so string-based values like "10.0" aren't left for the database to convert #820 [dave@cherryville.org]
2954
2955 * Added with additional settings for working with transactional fixtures and pre-loaded test databases #865 [mindel]
2956
2957 * Fixed acts_as_list to trigger remove_from_list on destroy after the fact, not before, so a unique position can be maintained #871 [Alisdair McDiarmid]
2958
2959 * Added the possibility of specifying fixtures in multiple calls #816 [kim@tinker.com]
2960
2961 * Added Base.exists?(id) that'll return true if an object of the class with the given id exists #854 [stian@grytoyr.net]
2962
2963 * Added optionally allow for nil or empty strings with validates_numericality_of #801 [Sebastian Kanthak]
2964
2965 * Fixed problem with using slashes in validates_format_of regular expressions #801 [Sebastian Kanthak]
2966
2967 * Fixed that SQLite3 exceptions are caught and reported properly #823 [yerejm]
2968
2969 * Added that all types of after_find/after_initialized callbacks are triggered if the explicit implementation is present, not only the explicit implementation itself
2970
2971 * Fixed that symbols can be used on attribute assignment, like page.emails.create(:subject => data.subject, :body => data.body)
2972
2973
2974 *1.8.0* (7th March, 2005)
2975
2976 * Added ActiveRecord::Base.colorize_logging to control whether to use colors in logs or not (on by default)
2977
2978 * Added support for timestamp with time zone in PostgreSQL #560 [Scott Barron]
2979
2980 * Added MultiparameterAssignmentErrors and AttributeAssignmentError exceptions #777 [demetrius]. Documentation:
2981
2982 * +MultiparameterAssignmentErrors+ -- collection of errors that occurred during a mass assignment using the
2983 +attributes=+ method. The +errors+ property of this exception contains an array of +AttributeAssignmentError+
2984 objects that should be inspected to determine which attributes triggered the errors.
2985 * +AttributeAssignmentError+ -- an error occurred while doing a mass assignment through the +attributes=+ method.
2986 You can inspect the +attribute+ property of the exception object to determine which attribute triggered the error.
2987
2988 * Fixed that postgresql adapter would fails when reading bytea fields with null value #771 [rodrigo k]
2989
2990 * Added transactional fixtures that uses rollback to undo changes to fixtures instead of DELETE/INSERT -- it's much faster. See documentation under Fixtures #760 [Jeremy Kemper]
2991
2992 * Added destruction of dependent objects in has_one associations when a new assignment happens #742 [mindel]. Example:
2993
2994 class Account < ActiveRecord::Base
2995 has_one :credit_card, :dependent => true
2996 end
2997 class CreditCard < ActiveRecord::Base
2998 belongs_to :account
2999 end
3000
3001 account.credit_card # => returns existing credit card, lets say id = 12
3002 account.credit_card = CreditCard.create("number" => "123")
3003 account.save # => CC with id = 12 is destroyed
3004
3005
3006 * Added validates_numericality_of #716 [Sebastian Kanthak/Chris McGrath]. Docuemntation:
3007
3008 Validates whether the value of the specified attribute is numeric by trying to convert it to
3009 a float with Kernel.Float (if <tt>integer</tt> is false) or applying it to the regular expression
3010 <tt>/^[\+\-]?\d+$/</tt> (if <tt>integer</tt> is set to true).
3011
3012 class Person < ActiveRecord::Base
3013 validates_numericality_of :value, :on => :create
3014 end
3015
3016 Configuration options:
3017 * <tt>message</tt> - A custom error message (default is: "is not a number")
3018 * <tt>on</tt> Specifies when this validation is active (default is :save, other options :create, :update)
3019 * <tt>only_integer</tt> Specifies whether the value has to be an integer, e.g. an integral value (default is false)
3020
3021
3022 * Fixed that HasManyAssociation#count was using :finder_sql rather than :counter_sql if it was available #445 [Scott Barron]
3023
3024 * Added better defaults for composed_of, so statements like composed_of :time_zone, :mapping => %w( time_zone time_zone ) can be written without the mapping part (it's now assumed)
3025
3026 * Added MacroReflection#macro which will return a symbol describing the macro used (like :composed_of or :has_many) #718, #248 [james@slashetc.com]
3027
3028
3029 *1.7.0* (24th February, 2005)
3030
3031 * Changed the auto-timestamping feature to use ActiveRecord::Base.default_timezone instead of entertaining the parallel ActiveRecord::Base.timestamps_gmt method. The latter is now deprecated and will throw a warning on use (but still work) #710 [Jamis Buck]
3032
3033 * Added a OCI8-based Oracle adapter that has been verified to work with Oracle 8 and 9 #629 [Graham Jenkins]. Usage notes:
3034
3035 1. Key generation uses a sequence "rails_sequence" for all tables. (I couldn't find a simple
3036 and safe way of passing table-specific sequence information to the adapter.)
3037 2. Oracle uses DATE or TIMESTAMP datatypes for both dates and times. Consequently I have had to
3038 resort to some hacks to get data converted to Date or Time in Ruby.
3039 If the column_name ends in _at (like created_at, updated_at) it's created as a Ruby Time. Else if the
3040 hours/minutes/seconds are 0, I make it a Ruby Date. Else it's a Ruby Time.
3041 This is nasty - but if you use Duck Typing you'll probably not care very much.
3042 In 9i it's tempting to map DATE to Date and TIMESTAMP to Time but I don't think that is
3043 valid - too many databases use DATE for both.
3044 Timezones and sub-second precision on timestamps are not supported.
3045 3. Default values that are functions (such as "SYSDATE") are not supported. This is a
3046 restriction of the way active record supports default values.
3047 4. Referential integrity constraints are not fully supported. Under at least
3048 some circumstances, active record appears to delete parent and child records out of
3049 sequence and out of transaction scope. (Or this may just be a problem of test setup.)
3050
3051 The OCI8 driver can be retrieved from http://rubyforge.org/projects/ruby-oci8/
3052
3053 * Added option :schema_order to the PostgreSQL adapter to support the use of multiple schemas per database #697 [YuriSchimke]
3054
3055 * Optimized the SQL used to generate has_and_belongs_to_many queries by listing the join table first #693 [yerejm]
3056
3057 * Fixed that when using validation macros with a custom message, if you happened to use single quotes in the message string you would get a parsing error #657 [tonka]
3058
3059 * Fixed that Active Record would throw Broken Pipe errors with FCGI when the MySQL connection timed out instead of reconnecting #428 [Nicholas Seckar]
3060
3061 * Added options to specify an SSL connection for MySQL. Define the following attributes in the connection config (config/database.yml in Rails) to use it: sslkey, sslcert, sslca, sslcapath, sslcipher. To use SSL with no client certs, just set :sslca = '/dev/null'. http://dev.mysql.com/doc/mysql/en/secure-connections.html #604 [daniel@nightrunner.com]
3062
3063 * Added automatic dropping/creating of test tables for running the unit tests on all databases #587 [adelle@bullet.net.au]
3064
3065 * Fixed that find_by_* would fail when column names had numbers #670 [demetrius]
3066
3067 * Fixed the SQL Server adapter on a bunch of issues #667 [DeLynn]
3068
3069 1. Created a new columns method that is much cleaner.
3070 2. Corrected a problem with the select and select_all methods
3071 that didn't account for the LIMIT clause being passed into raw SQL statements.
3072 3. Implemented the string_to_time method in order to create proper instances of the time class.
3073 4. Added logic to the simplified_type method that allows the database to specify the scale of float data.
3074 5. Adjusted the quote_column_name to account for the fact that MS SQL is bothered by a forward slash in the data string.
3075
3076 * Fixed that the dynamic finder like find_all_by_something_boolean(false) didn't work #649 [lmarlow]
3077
3078 * Added validates_each that validates each specified attribute against a block #610 [Jeremy Kemper]. Example:
3079
3080 class Person < ActiveRecord::Base
3081 validates_each :first_name, :last_name do |record, attr|
3082 record.errors.add attr, 'starts with z.' if attr[0] == ?z
3083 end
3084 end
3085
3086 * Added :allow_nil as an explicit option for validates_length_of, so unless that's set to true having the attribute as nil will also return an error if a range is specified as :within #610 [Jeremy Kemper]
3087
3088 * Added that validates_* now accept blocks to perform validations #618 [Tim Bates]. Example:
3089
3090 class Person < ActiveRecord::Base
3091 validate { |person| person.errors.add("title", "will never be valid") if SHOULD_NEVER_BE_VALID }
3092 end
3093
3094 * Addded validation for validate all the associated objects before declaring failure with validates_associated #618 [Tim Bates]
3095
3096 * Added keyword-style approach to defining the custom relational bindings #545 [Jamis Buck]. Example:
3097
3098 class Project < ActiveRecord::Base
3099 primary_key "sysid"
3100 table_name "XYZ_PROJECT"
3101 inheritance_column { original_inheritance_column + "_id" }
3102 end
3103
3104 * Fixed Base#clone for use with PostgreSQL #565 [hanson@surgery.wisc.edu]
3105
3106
3107 *1.6.0* (January 25th, 2005)
3108
3109 * Added that has_many association build and create methods can take arrays of record data like Base#create and Base#build to build/create multiple records at once.
3110
3111 * Added that Base#delete and Base#destroy both can take an array of ids to delete/destroy #336
3112
3113 * Added the option of supplying an array of attributes to Base#create, so that multiple records can be created at once.
3114
3115 * Added the option of supplying an array of ids and attributes to Base#update, so that multiple records can be updated at once (inspired by #526/Duane Johnson). Example
3116
3117 people = { 1 => { "first_name" => "David" }, 2 => { "first_name" => "Jeremy"} }
3118 Person.update(people.keys, people.values)
3119
3120 * Added ActiveRecord::Base.timestamps_gmt that can be set to true to make the automated timestamping use GMT instead of local time #520 [Scott Baron]
3121
3122 * Added that update_all calls sanitize_sql on its updates argument, so stuff like MyRecord.update_all(['time = ?', Time.now]) works #519 [notahat]
3123
3124 * Fixed that the dynamic finders didn't treat nil as a "IS NULL" but rather "= NULL" case #515 [Demetrius]
3125
3126 * Added bind-named arrays for interpolating a group of ids or strings in conditions #528 [Jeremy Kemper]
3127
3128 * Added that has_and_belongs_to_many associations with additional attributes also can be created between unsaved objects and only committed to the database when Base#save is called on the associator #524 [Eric Anderson]
3129
3130 * Fixed that records fetched with piggy-back attributes or through rich has_and_belongs_to_many associations couldn't be saved due to the extra attributes not part of the table #522 [Eric Anderson]
3131
3132 * Added mass-assignment protection for the inheritance column -- regardless of a custom column is used or not
3133
3134 * Fixed that association proxies would fail === tests like PremiumSubscription === @account.subscription
3135
3136 * Fixed that column aliases didn't work as expected with the new MySql411 driver #507 [Demetrius]
3137
3138 * Fixed that find_all would produce invalid sql when called sequentialy #490 [Scott Baron]
3139
3140
3141 *1.5.1* (January 18th, 2005)
3142
3143 * Fixed that the belongs_to and has_one proxy would fail a test like 'if project.manager' -- this unfortunately also means that you can't call methods like project.manager.build unless there already is a manager on the project #492 [Tim Bates]
3144
3145 * Fixed that the Ruby/MySQL adapter wouldn't connect if the password was empty #503 [Pelle]
3146
3147
3148 *1.5.0* (January 17th, 2005)
3149
3150 * Fixed that unit tests for MySQL are now run as the "rails" user instead of root #455 [Eric Hodel]
3151
3152 * Added validates_associated that enables validation of objects in an unsaved association #398 [Tim Bates]. Example:
3153
3154 class Book < ActiveRecord::Base
3155 has_many :pages
3156 belongs_to :library
3157
3158 validates_associated :pages, :library
3159 end
3160
3161 * Added support for associating unsaved objects #402 [Tim Bates]. Rules that govern this addition:
3162
3163 == Unsaved objects and associations
3164
3165 You can manipulate objects and associations before they are saved to the database, but there is some special behaviour you should be
3166 aware of, mostly involving the saving of associated objects.
3167
3168 === One-to-one associations
3169
3170 * Assigning an object to a has_one association automatically saves that object, and the object being replaced (if there is one), in
3171 order to update their primary keys - except if the parent object is unsaved (new_record? == true).
3172 * If either of these saves fail (due to one of the objects being invalid) the assignment statement returns false and the assignment
3173 is cancelled.
3174 * If you wish to assign an object to a has_one association without saving it, use the #association.build method (documented below).
3175 * Assigning an object to a belongs_to association does not save the object, since the foreign key field belongs on the parent. It does
3176 not save the parent either.
3177
3178 === Collections
3179
3180 * Adding an object to a collection (has_many or has_and_belongs_to_many) automatically saves that object, except if the parent object
3181 (the owner of the collection) is not yet stored in the database.
3182 * If saving any of the objects being added to a collection (via #push or similar) fails, then #push returns false.
3183 * You can add an object to a collection without automatically saving it by using the #collection.build method (documented below).
3184 * All unsaved (new_record? == true) members of the collection are automatically saved when the parent is saved.
3185
3186 * Added replace to associations, so you can do project.manager.replace(new_manager) or project.milestones.replace(new_milestones) #402 [Tim Bates]
3187
3188 * Added build and create methods to has_one and belongs_to associations, so you can now do project.manager.build(attributes) #402 [Tim Bates]
3189
3190 * Added that if a before_* callback returns false, all the later callbacks and the associated action are cancelled. If an after_* callback returns false, all the later callbacks are cancelled. Callbacks are generally run in the order they are defined, with the exception of callbacks defined as methods on the model, which are called last. #402 [Tim Bates]
3191
3192 * Fixed that Base#== wouldn't work for multiple references to the same unsaved object #402 [Tim Bates]
3193
3194 * Fixed binary support for PostgreSQL #444 [alex@byzantine.no]
3195
3196 * Added a differenciation between AssociationCollection#size and -length. Now AssociationCollection#size returns the size of the
3197 collection by executing a SELECT COUNT(*) query if the collection hasn't been loaded and calling collection.size if it has. If
3198 it's more likely than not that the collection does have a size larger than zero and you need to fetch that collection afterwards,
3199 it'll take one less SELECT query if you use length.
3200
3201 * Added Base#attributes that returns a hash of all the attributes with their names as keys and clones of their objects as values #433 [atyp.de]
3202
3203 * Fixed that foreign keys named the same as the association would cause stack overflow #437 [Eric Anderson]
3204
3205 * Fixed default scope of acts_as_list from "1" to "1 = 1", so it'll work in PostgreSQL (among other places) #427 [Alexey]
3206
3207 * Added Base#reload that reloads the attributes of an object from the database #422 [Andreas Schwarz]
3208
3209 * Added SQLite3 compatibility through the sqlite3-ruby adapter by Jamis Buck #381 [Jeremy Kemper]
3210
3211 * Added support for the new protocol spoken by MySQL 4.1.1+ servers for the Ruby/MySQL adapter that ships with Rails #440 [Matt Mower]
3212
3213 * Added that Observers can use the observes class method instead of overwriting self.observed_class().
3214
3215 Before:
3216 class ListSweeper < ActiveRecord::Base
3217 def self.observed_class() [ List, Item ]
3218 end
3219
3220 After:
3221 class ListSweeper < ActiveRecord::Base
3222 observes List, Item
3223 end
3224
3225 * Fixed that conditions in has_many and has_and_belongs_to_many should be interpolated just like the finder_sql is
3226
3227 * Fixed Base#update_attribute to be indifferent to whether a string or symbol is used to describe the name
3228
3229 * Added Base#toggle(attribute) and Base#toggle!(attribute) that makes it easier to flip a switch or flag.
3230
3231 Before: topic.update_attribute(:approved, !approved?)
3232 After : topic.toggle!(:approved)
3233
3234 * Added Base#increment!(attribute) and Base#decrement!(attribute) that also saves the records. Example:
3235
3236 page.views # => 1
3237 page.increment!(:views) # executes an UPDATE statement
3238 page.views # => 2
3239
3240 page.increment(:views).increment!(:views)
3241 page.views # => 4
3242
3243 * Added Base#increment(attribute) and Base#decrement(attribute) that encapsulates the += 1 and -= 1 patterns.
3244
3245
3246
3247
3248 *1.14.2* (April 9th, 2005)
3249
3250 * Fixed calculations for the Oracle Adapter (closes #4626) [Michael Schoen]
3251
3252
3253 *1.14.1* (April 6th, 2006)
3254
3255 * Fix type_name_with_module to handle type names that begin with '::'. Closes #4614. [Nicholas Seckar]
3256
3257 * Fixed that that multiparameter assignment doesn't work with aggregations (closes #4620) [Lars Pind]
3258
3259 * Enable Limit/Offset in Calculations (closes #4558) [lmarlow]
3260
3261 * Fixed that loading including associations returns all results if Load IDs For Limited Eager Loading returns none (closes #4528) [Rick Olson]
3262
3263 * Fixed HasManyAssociation#find bugs when :finder_sql is set #4600 [lagroue@free.fr]
3264
3265 * Allow AR::Base#respond_to? to behave when @attributes is nil [Ryan Davis]
3266
3267 * Support eager includes when going through a polymorphic has_many association. [Rick Olson]
3268
3269 * Added support for eagerly including polymorphic has_one associations. (closes #4525) [Rick Olson]
3270
3271 class Post < ActiveRecord::Base
3272 has_one :tagging, :as => :taggable
3273 end
3274
3275 Post.find :all, :include => :tagging
3276
3277 * Added descriptive error messages for invalid has_many :through associations: going through :has_one or :has_and_belongs_to_many [Rick Olson]
3278
3279 * Added support for going through a polymorphic has_many association: (closes #4401) [Rick Olson]
3280
3281 class PhotoCollection < ActiveRecord::Base
3282 has_many :photos, :as => :photographic
3283 belongs_to :firm
3284 end
3285
3286 class Firm < ActiveRecord::Base
3287 has_many :photo_collections
3288 has_many :photos, :through => :photo_collections
3289 end
3290
3291 * Multiple fixes and optimizations in PostgreSQL adapter, allowing ruby-postgres gem to work properly. [ruben.nine@gmail.com]
3292
3293 * Fixed that AssociationCollection#delete_all should work even if the records of the association are not loaded yet. [Florian Weber]
3294
3295 * Changed those private ActiveRecord methods to take optional third argument :auto instead of nil for performance optimizations. (closes #4456) [Stefan]
3296
3297 * Private ActiveRecord methods add_limit!, add_joins!, and add_conditions! take an OPTIONAL third argument 'scope' (closes #4456) [Rick Olson]
3298
3299 * DEPRECATED: Using additional attributes on has_and_belongs_to_many associations. Instead upgrade your association to be a real join model [David Heinemeier Hansson]
3300
3301 * Fixed that records returned from has_and_belongs_to_many associations with additional attributes should be marked as read only (fixes #4512) [David Heinemeier Hansson]
3302
3303 * Do not implicitly mark recordss of has_many :through as readonly but do mark habtm records as readonly (eventually only on join tables without rich attributes). [Marcel Mollina Jr.]
3304
3305 * Fixed broken OCIAdapter #4457 [Michael Schoen]
3306
3307
3308 *1.14.0* (March 27th, 2006)
3309
3310 * Replace 'rescue Object' with a finer grained rescue. Closes #4431. [Nicholas Seckar]
3311
3312 * Fixed eager loading so that an aliased table cannot clash with a has_and_belongs_to_many join table [Rick Olson]
3313
3314 * Add support for :include to with_scope [andrew@redlinesoftware.com]
3315
3316 * Support the use of public synonyms with the Oracle adapter; required ruby-oci8 v0.1.14 #4390 [Michael Schoen]
3317
3318 * Change periods (.) in table aliases to _'s. Closes #4251 [jeff@ministrycentered.com]
3319
3320 * Changed has_and_belongs_to_many join to INNER JOIN for Mysql 3.23.x. Closes #4348 [Rick Olson]
3321
3322 * Fixed issue that kept :select options from being scoped [Rick Olson]
3323
3324 * Fixed db_schema_import when binary types are present #3101 [David Heinemeier Hansson]
3325
3326 * Fixed that MySQL enums should always be returned as strings #3501 [David Heinemeier Hansson]
3327
3328 * Change has_many :through to use the :source option to specify the source association. :class_name is now ignored. [Rick Olson]
3329
3330 class Connection < ActiveRecord::Base
3331 belongs_to :user
3332 belongs_to :channel
3333 end
3334
3335 class Channel < ActiveRecord::Base
3336 has_many :connections
3337 has_many :contacts, :through => :connections, :class_name => 'User' # OLD
3338 has_many :contacts, :through => :connections, :source => :user # NEW
3339 end
3340
3341 * Fixed DB2 adapter so nullable columns will be determines correctly now and quotes from column default values will be removed #4350 [contact@maik-schmidt.de]
3342
3343 * Allow overriding of find parameters in scoped has_many :through calls [Rick Olson]
3344
3345 In this example, :include => false disables the default eager association from loading. :select changes the standard
3346 select clause. :joins specifies a join that is added to the end of the has_many :through query.
3347
3348 class Post < ActiveRecord::Base
3349 has_many :tags, :through => :taggings, :include => :tagging do
3350 def add_joins_and_select
3351 find :all, :select => 'tags.*, authors.id as author_id', :include => false,
3352 :joins => 'left outer join posts on taggings.taggable_id = posts.id left outer join authors on posts.author_id = authors.id'
3353 end
3354 end
3355 end
3356
3357 * Fixed that schema changes while the database was open would break any connections to a SQLite database (now we reconnect if that error is throw) [David Heinemeier Hansson]
3358
3359 * Don't classify the has_one class when eager loading, it is already singular. Add tests. (closes #4117) [Jonathan Viney]
3360
3361 * Quit ignoring default :include options in has_many :through calls [Mark James]
3362
3363 * Allow has_many :through associations to find the source association by setting a custom class (closes #4307) [Jonathan Viney]
3364
3365 * Eager Loading support added for has_many :through => :has_many associations (see below). [Rick Olson]
3366
3367 * Allow has_many :through to work on has_many associations (closes #3864) [sco@scottraymond.net] Example:
3368
3369 class Firm < ActiveRecord::Base
3370 has_many :clients
3371 has_many :invoices, :through => :clients
3372 end
3373
3374 class Client < ActiveRecord::Base
3375 belongs_to :firm
3376 has_many :invoices
3377 end
3378
3379 class Invoice < ActiveRecord::Base
3380 belongs_to :client
3381 end
3382
3383 * Raise error when trying to select many polymorphic objects with has_many :through or :include (closes #4226) [Josh Susser]
3384
3385 * Fixed has_many :through to include :conditions set on the :through association. closes #4020 [Jonathan Viney]
3386
3387 * Fix that has_many :through honors the foreign key set by the belongs_to association in the join model (closes #4259) [andylien@gmail.com / Rick Olson]
3388
3389 * SQL Server adapter gets some love #4298 [Ryan Tomayko]
3390
3391 * Added OpenBase database adapter that builds on top of the http://www.spice-of-life.net/ruby-openbase/ driver. All functionality except LIMIT/OFFSET is supported #3528 [derrickspell@cdmplus.com]
3392
3393 * Rework table aliasing to account for truncated table aliases. Add smarter table aliasing when doing eager loading of STI associations. This allows you to use the association name in the order/where clause. [Jonathan Viney / Rick Olson] #4108 Example (SpecialComment is using STI):
3394
3395 Author.find(:all, :include => { :posts => :special_comments }, :order => 'special_comments.body')
3396
3397 * Add AbstractAdapter#table_alias_for to create table aliases according to the rules of the current adapter. [Rick Olson]
3398
3399 * Provide access to the underlying database connection through Adapter#raw_connection. Enables the use of db-specific methods without complicating the adapters. #2090 [Michael Koziarski]
3400
3401 * Remove broken attempts at handling columns with a default of 'now()' in the postgresql adapter. #2257 [Michael Koziarski]
3402
3403 * Added connection#current_database that'll return of the current database (only works in MySQL, SQL Server, and Oracle so far -- please help implement for the rest of the adapters) #3663 [Tom Ward]
3404
3405 * Fixed that Migration#execute would have the table name prefix appended to its query #4110 [mark.imbriaco@pobox.com]
3406
3407 * Make all tinyint(1) variants act like boolean in mysql (tinyint(1) unsigned, etc.) [Jamis Buck]
3408
3409 * Use association's :conditions when eager loading. [Jeremy Evans] #4144
3410
3411 * Alias the has_and_belongs_to_many join table on eager includes. #4106 [Jeremy Evans]
3412
3413 This statement would normally error because the projects_developers table is joined twice, and therefore joined_on would be ambiguous.
3414
3415 Developer.find(:all, :include => {:projects => :developers}, :conditions => 'join_project_developers.joined_on IS NOT NULL')
3416
3417 * Oracle adapter gets some love #4230 [Michael Schoen]
3418
3419 * Changes :text to CLOB rather than BLOB [Moses Hohman]
3420 * Fixes an issue with nil numeric length/scales (several)
3421 * Implements support for XMLTYPE columns [wilig / Kubo Takehiro]
3422 * Tweaks a unit test to get it all green again
3423 * Adds support for #current_database
3424
3425 * Added Base.abstract_class? that marks which classes are not part of the Active Record hierarchy #3704 [Rick Olson]
3426
3427 class CachedModel < ActiveRecord::Base
3428 self.abstract_class = true
3429 end
3430
3431 class Post < CachedModel
3432 end
3433
3434 CachedModel.abstract_class?
3435 => true
3436
3437 Post.abstract_class?
3438 => false
3439
3440 Post.base_class
3441 => Post
3442
3443 Post.table_name
3444 => 'posts'
3445
3446 * Allow :dependent options to be used with polymorphic joins. #3820 [Rick Olson]
3447
3448 class Foo < ActiveRecord::Base
3449 has_many :attachments, :as => :attachable, :dependent => :delete_all
3450 end
3451
3452 * Nicer error message on has_many :through when :through reflection can not be found. #4042 [court3nay]
3453
3454 * Upgrade to Transaction::Simple 1.3 [Jamis Buck]
3455
3456 * Catch FixtureClassNotFound when using instantiated fixtures on a fixture that has no ActiveRecord model [Rick Olson]
3457
3458 * Allow ordering of calculated results and/or grouped fields in calculations [solo@gatelys.com]
3459
3460 * Make ActiveRecord::Base#save! return true instead of nil on success. #4173 [johan@johansorensen.com]
3461
3462 * Dynamically set allow_concurrency. #4044 [Stefan Kaes]
3463
3464 * Added Base#to_xml that'll turn the current record into a XML representation [David Heinemeier Hansson]. Example:
3465
3466 topic.to_xml
3467
3468 ...returns:
3469
3470 <?xml version="1.0" encoding="UTF-8"?>
3471 <topic>
3472 <title>The First Topic</title>
3473 <author-name>David</author-name>
3474 <id type="integer">1</id>
3475 <approved type="boolean">false</approved>
3476 <replies-count type="integer">0</replies-count>
3477 <bonus-time type="datetime">2000-01-01 08:28:00</bonus-time>
3478 <written-on type="datetime">2003-07-16 09:28:00</written-on>
3479 <content>Have a nice day</content>
3480 <author-email-address>david@loudthinking.com</author-email-address>
3481 <parent-id></parent-id>
3482 <last-read type="date">2004-04-15</last-read>
3483 </topic>
3484
3485 ...and you can configure with:
3486
3487 topic.to_xml(:skip_instruct => true, :except => [ :id, bonus_time, :written_on, replies_count ])
3488
3489 ...that'll return:
3490
3491 <topic>
3492 <title>The First Topic</title>
3493 <author-name>David</author-name>
3494 <approved type="boolean">false</approved>
3495 <content>Have a nice day</content>
3496 <author-email-address>david@loudthinking.com</author-email-address>
3497 <parent-id></parent-id>
3498 <last-read type="date">2004-04-15</last-read>
3499 </topic>
3500
3501 You can even do load first-level associations as part of the document:
3502
3503 firm.to_xml :include => [ :account, :clients ]
3504
3505 ...that'll return something like:
3506
3507 <?xml version="1.0" encoding="UTF-8"?>
3508 <firm>
3509 <id type="integer">1</id>
3510 <rating type="integer">1</rating>
3511 <name>37signals</name>
3512 <clients>
3513 <client>
3514 <rating type="integer">1</rating>
3515 <name>Summit</name>
3516 </client>
3517 <client>
3518 <rating type="integer">1</rating>
3519 <name>Microsoft</name>
3520 </client>
3521 </clients>
3522 <account>
3523 <id type="integer">1</id>
3524 <credit-limit type="integer">50</credit-limit>
3525 </account>
3526 </firm>
3527
3528 * Allow :counter_cache to take a column name for custom counter cache columns [Jamis Buck]
3529
3530 * Documentation fixes for :dependent [robby@planetargon.com]
3531
3532 * Stop the MySQL adapter crashing when views are present. #3782 [Jonathan Viney]
3533
3534 * Don't classify the belongs_to class, it is already singular #4117 [keithm@infused.org]
3535
3536 * Allow set_fixture_class to take Classes instead of strings for a class in a module. Raise FixtureClassNotFound if a fixture can't load. [Rick Olson]
3537
3538 * Fix quoting of inheritance column for STI eager loading #4098 [Jonathan Viney <jonathan@bluewire.net.nz>]
3539
3540 * Added smarter table aliasing for eager associations for multiple self joins #3580 [Rick Olson]
3541
3542 * The first time a table is referenced in a join, no alias is used.
3543 * After that, the parent class name and the reflection name are used.
3544
3545 Tree.find(:all, :include => :children) # LEFT OUTER JOIN trees AS tree_children ...
3546
3547 * Any additional join references get a numerical suffix like '_2', '_3', etc.
3548
3549 * Fixed eager loading problems with single-table inheritance #3580 [Rick Olson]. Post.find(:all, :include => :special_comments) now returns all posts, and any special comments that the posts may have. And made STI work with has_many :through and polymorphic belongs_to.
3550
3551 * Added cascading eager loading that allows for queries like Author.find(:all, :include=> { :posts=> :comments }), which will fetch all authors, their posts, and the comments belonging to those posts in a single query (using LEFT OUTER JOIN) #3913 [anna@wota.jp]. Examples:
3552
3553 # cascaded in two levels
3554 >> Author.find(:all, :include=>{:posts=>:comments})
3555 => authors
3556 +- posts
3557 +- comments
3558
3559 # cascaded in two levels and normal association
3560 >> Author.find(:all, :include=>[{:posts=>:comments}, :categorizations])
3561 => authors
3562 +- posts
3563 +- comments
3564 +- categorizations
3565
3566 # cascaded in two levels with two has_many associations
3567 >> Author.find(:all, :include=>{:posts=>[:comments, :categorizations]})
3568 => authors
3569 +- posts
3570 +- comments
3571 +- categorizations
3572
3573 # cascaded in three levels
3574 >> Company.find(:all, :include=>{:groups=>{:members=>{:favorites}}})
3575 => companies
3576 +- groups
3577 +- members
3578 +- favorites
3579
3580 * Make counter cache work when replacing an association #3245 [eugenol@gmail.com]
3581
3582 * Make migrations verbose [Jamis Buck]
3583
3584 * Make counter_cache work with polymorphic belongs_to [Jamis Buck]
3585
3586 * Fixed that calling HasOneProxy#build_model repeatedly would cause saving to happen #4058 [anna@wota.jp]
3587
3588 * Added Sybase database adapter that relies on the Sybase Open Client bindings (see http://raa.ruby-lang.org/project/sybase-ctlib) #3765 [John Sheets]. It's almost completely Active Record compliant (including migrations), but has the following caveats:
3589
3590 * Does not support DATE SQL column types; use DATETIME instead.
3591 * Date columns on HABTM join tables are returned as String, not Time.
3592 * Insertions are potentially broken for :polymorphic join tables
3593 * BLOB column access not yet fully supported
3594
3595 * Clear stale, cached connections left behind by defunct threads. [Jeremy Kemper]
3596
3597 * CHANGED DEFAULT: set ActiveRecord::Base.allow_concurrency to false. Most AR usage is in single-threaded applications. [Jeremy Kemper]
3598
3599 * Renamed the "oci" adapter to "oracle", but kept the old name as an alias #4017 [Michael Schoen]
3600
3601 * Fixed that Base.save should always return false if the save didn't succeed, including if it has halted by before_save's #1861, #2477 [David Heinemeier Hansson]
3602
3603 * Speed up class -> connection caching and stale connection verification. #3979 [Stefan Kaes]
3604
3605 * Add set_fixture_class to allow the use of table name accessors with models which use set_table_name. [Kevin Clark]
3606
3607 * Added that fixtures to placed in subdirectories of the main fixture files are also loaded #3937 [dblack@wobblini.net]
3608
3609 * Define attribute query methods to avoid method_missing calls. #3677 [Jonathan Viney]
3610
3611 * ActiveRecord::Base.remove_connection explicitly closes database connections and doesn't corrupt the connection cache. Introducing the disconnect! instance method for the PostgreSQL, MySQL, and SQL Server adapters; implementations for the others are welcome. #3591 [Simon Stapleton, Tom Ward]
3612
3613 * Added support for nested scopes #3407 [anna@wota.jp]. Examples:
3614
3615 Developer.with_scope(:find => { :conditions => "salary > 10000", :limit => 10 }) do
3616 Developer.find(:all) # => SELECT * FROM developers WHERE (salary > 10000) LIMIT 10
3617
3618 # inner rule is used. (all previous parameters are ignored)
3619 Developer.with_exclusive_scope(:find => { :conditions => "name = 'Jamis'" }) do
3620 Developer.find(:all) # => SELECT * FROM developers WHERE (name = 'Jamis')
3621 end
3622
3623 # parameters are merged
3624 Developer.with_scope(:find => { :conditions => "name = 'Jamis'" }) do
3625 Developer.find(:all) # => SELECT * FROM developers WHERE (( salary > 10000 ) AND ( name = 'Jamis' )) LIMIT 10
3626 end
3627 end
3628
3629 * Fixed db2 connection with empty user_name and auth options #3622 [phurley@gmail.com]
3630
3631 * Fixed validates_length_of to work on UTF-8 strings by using characters instead of bytes #3699 [Masao Mutoh]
3632
3633 * Fixed that reflections would bleed across class boundaries in single-table inheritance setups #3796 [Lars Pind]
3634
3635 * Added calculations: Base.count, Base.average, Base.sum, Base.minimum, Base.maxmium, and the generic Base.calculate. All can be used with :group and :having. Calculations and statitics need no longer require custom SQL. #3958 [Rick Olson]. Examples:
3636
3637 Person.average :age
3638 Person.minimum :age
3639 Person.maximum :age
3640 Person.sum :salary, :group => :last_name
3641
3642 * Renamed Errors#count to Errors#size but kept an alias for the old name (and included an alias for length too) #3920 [Luke Redpath]
3643
3644 * Reflections don't attempt to resolve module nesting of association classes. Simplify type computation. [Jeremy Kemper]
3645
3646 * Improved the Oracle OCI Adapter with better performance for column reflection (from #3210), fixes to migrations (from #3476 and #3742), tweaks to unit tests (from #3610), and improved documentation (from #2446) #3879 [Aggregated by schoenm@earthlink.net]
3647
3648 * Fixed that the schema_info table used by ActiveRecord::Schema.define should respect table pre- and suffixes #3834 [rubyonrails@atyp.de]
3649
3650 * Added :select option to Base.count that'll allow you to select something else than * to be counted on. Especially important for count queries using DISTINCT #3839 [Stefan Kaes]
3651
3652 * Correct syntax error in mysql DDL, and make AAACreateTablesTest run first [Bob Silva]
3653
3654 * Allow :include to be used with has_many :through associations #3611 [Michael Schoen]
3655
3656 * PostgreSQL: smarter schema dumps using pk_and_sequence_for(table). #2920 [Blair Zajac]
3657
3658 * SQLServer: more compatible limit/offset emulation. #3779 [Tom Ward]
3659
3660 * Polymorphic join support for has_one associations (has_one :foo, :as => :bar) #3785 [Rick Olson]
3661
3662 * PostgreSQL: correctly parse negative integer column defaults. #3776 [bellis@deepthought.org]
3663
3664 * Fix problems with count when used with :include [Jeremy Hopple and Kevin Clark]
3665
3666 * ActiveRecord::RecordInvalid now states which validations failed in its default error message [Tobias Lütke]
3667
3668 * Using AssociationCollection#build with arrays of hashes should call build, not create [David Heinemeier Hansson]
3669
3670 * Remove definition of reloadable? from ActiveRecord::Base to make way for new Reloadable code. [Nicholas Seckar]
3671
3672 * Fixed schema handling for DB2 adapter that didn't work: an initial schema could be set, but it wasn't used when getting tables and indexes #3678 [Maik Schmidt]
3673
3674 * Support the :column option for remove_index with the PostgreSQL adapter. #3661 [Shugo Maeda]
3675
3676 * Add documentation for add_index and remove_index. #3600 [Manfred Stienstra <m.stienstra@fngtps.com>]
3677
3678 * If the OCI library is not available, raise an exception indicating as much. #3593 [Michael Schoen]
3679
3680 * Add explicit :order in finder tests as postgresql orders results differently by default. #3577. [Rick Olson]
3681
3682 * Make dynamic finders honor additional passed in :conditions. #3569 [Oleg Pudeyev <pudeyo@rpi.edu>, Marcel Molina Jr.]
3683
3684 * Show a meaningful error when the DB2 adapter cannot be loaded due to missing dependencies. [Nicholas Seckar]
3685
3686 * Make .count work for has_many associations with multi line finder sql [Michael Schoen]
3687
3688 * Add AR::Base.base_class for querying the ancestor AR::Base subclass [Jamis Buck]
3689
3690 * Allow configuration of the column used for optimistic locking [wilsonb@gmail.com]
3691
3692 * Don't hardcode 'id' in acts as list. [ror@philippeapril.com]
3693
3694 * Fix date errors for SQLServer in association tests. #3406 [Kevin Clark]
3695
3696 * Escape database name in MySQL adapter when creating and dropping databases. #3409 [anna@wota.jp]
3697
3698 * Disambiguate table names for columns in validates_uniquness_of's WHERE clause. #3423 [alex.borovsky@gmail.com]
3699
3700 * .with_scope imposed create parameters now bypass attr_protected [Tobias Lütke]
3701
3702 * Don't raise an exception when there are more keys than there are named bind variables when sanitizing conditions. [Marcel Molina Jr.]
3703
3704 * Multiple enhancements and adjustments to DB2 adaptor. #3377 [contact@maik-schmidt.de]
3705
3706 * Sanitize scoped conditions. [Marcel Molina Jr.]
3707
3708 * Added option to Base.reflection_of_all_associations to specify a specific association to scope the call. For example Base.reflection_of_all_associations(:has_many) [David Heinemeier Hansson]
3709
3710 * Added ActiveRecord::SchemaDumper.ignore_tables which tells SchemaDumper which tables to ignore. Useful for tables with funky column like the ones required for tsearch2. [Tobias Lütke]
3711
3712 * SchemaDumper now doesn't fail anymore when there are unknown column types in the schema. Instead the table is ignored and a Comment is left in the schema.rb. [Tobias Lütke]
3713
3714 * Fixed that saving a model with multiple habtm associations would only save the first one. #3244 [yanowitz-rubyonrails@quantumfoam.org, Florian Weber]
3715
3716 * Fix change_column to work with PostgreSQL 7.x and 8.x. #3141 [wejn@box.cz, Rick Olson, Scott Barron]
3717
3718 * removed :piggyback in favor of just allowing :select on :through associations. [Tobias Lütke]
3719
3720 * made method missing delegation to class methods on relation target work on :through associations. [Tobias Lütke]
3721
3722 * made .find() work on :through relations. [Tobias Lütke]
3723
3724 * Fix typo in association docs. #3296. [Blair Zajac]
3725
3726 * Fixed :through relations when using STI inherited classes would use the inherited class's name as foreign key on the join model [Tobias Lütke]
3727
3728 *1.13.2* (December 13th, 2005)
3729
3730 * Become part of Rails 1.0
3731
3732 * MySQL: allow encoding option for mysql.rb driver. [Jeremy Kemper]
3733
3734 * Added option inheritance for find calls on has_and_belongs_to_many and has_many assosociations [David Heinemeier Hansson]. Example:
3735
3736 class Post
3737 has_many :recent_comments, :class_name => "Comment", :limit => 10, :include => :author
3738 end
3739
3740 post.recent_comments.find(:all) # Uses LIMIT 10 and includes authors
3741 post.recent_comments.find(:all, :limit => nil) # Uses no limit but include authors
3742 post.recent_comments.find(:all, :limit => nil, :include => nil) # Uses no limit and doesn't include authors
3743
3744 * Added option to specify :group, :limit, :offset, and :select options from find on has_and_belongs_to_many and has_many assosociations [David Heinemeier Hansson]
3745
3746 * MySQL: fixes for the bundled mysql.rb driver. #3160 [Justin Forder]
3747
3748 * SQLServer: fix obscure optimistic locking bug. #3068 [kajism@yahoo.com]
3749
3750 * SQLServer: support uniqueidentifier columns. #2930 [keithm@infused.org]
3751
3752 * SQLServer: cope with tables names qualified by owner. #3067 [jeff@ministrycentered.com]
3753
3754 * SQLServer: cope with columns with "desc" in the name. #1950 [Ron Lusk, Ryan Tomayko]
3755
3756 * SQLServer: cope with primary keys with "select" in the name. #3057 [rdifrango@captechventures.com]
3757
3758 * Oracle: active? performs a select instead of a commit. #3133 [Michael Schoen]
3759
3760 * MySQL: more robust test for nullified result hashes. #3124 [Stefan Kaes]
3761
3762 * Reloading an instance refreshes its aggregations as well as its associations. #3024 [François Beausoleil]
3763
3764 * Fixed that using :include together with :conditions array in Base.find would cause NoMethodError #2887 [Paul Hammmond]
3765
3766 * PostgreSQL: more robust sequence name discovery. #3087 [Rick Olson]
3767
3768 * Oracle: use syntax compatible with Oracle 8. #3131 [Michael Schoen]
3769
3770 * MySQL: work around ruby-mysql/mysql-ruby inconsistency with mysql.stat. Eliminate usage of mysql.ping because it doesn't guarantee reconnect. Explicitly close and reopen the connection instead. [Jeremy Kemper]
3771
3772 * Added preliminary support for polymorphic associations [David Heinemeier Hansson]
3773
3774 * Added preliminary support for join models [David Heinemeier Hansson]
3775
3776 * Allow validate_uniqueness_of to be scoped by more than just one column. #1559. [jeremy@jthopple.com, Marcel Molina Jr.]
3777
3778 * Firebird: active? and reconnect! methods for handling stale connections. #428 [Ken Kunz <kennethkunz@gmail.com>]
3779
3780 * Firebird: updated for FireRuby 0.4.0. #3009 [Ken Kunz <kennethkunz@gmail.com>]
3781
3782 * MySQL and PostgreSQL: active? compatibility with the pure-Ruby driver. #428 [Jeremy Kemper]
3783
3784 * Oracle: active? check pings the database rather than testing the last command status. #428 [Michael Schoen]
3785
3786 * SQLServer: resolve column aliasing/quoting collision when using limit or offset in an eager find. #2974 [kajism@yahoo.com]
3787
3788 * Reloading a model doesn't lose track of its connection. #2996 [junk@miriamtech.com, Jeremy Kemper]
3789
3790 * Fixed bug where using update_attribute after pushing a record to a habtm association of the object caused duplicate rows in the join table. #2888 [colman@rominato.com, Florian Weber, Michael Schoen]
3791
3792 * MySQL, PostgreSQL: reconnect! also reconfigures the connection. Otherwise, the connection 'loses' its settings if it times out and is reconnected. #2978 [Shugo Maeda]
3793
3794 * has_and_belongs_to_many: use JOIN instead of LEFT JOIN. [Jeremy Kemper]
3795
3796 * MySQL: introduce :encoding option to specify the character set for client, connection, and results. Only available for MySQL 4.1 and later with the mysql-ruby driver. Do SHOW CHARACTER SET in mysql client to see available encodings. #2975 [Shugo Maeda]
3797
3798 * Add tasks to create, drop and rebuild the MySQL and PostgreSQL test databases. [Marcel Molina Jr.]
3799
3800 * Correct boolean handling in generated reader methods. #2945 [Don Park, Stefan Kaes]
3801
3802 * Don't generate read methods for columns whose names are not valid ruby method names. #2946 [Stefan Kaes]
3803
3804 * Document :force option to create_table. #2921 [Blair Zajac <blair@orcaware.com>]
3805
3806 * Don't add the same conditions twice in has_one finder sql. #2916 [Jeremy Evans]
3807
3808 * Rename Version constant to VERSION. #2802 [Marcel Molina Jr.]
3809
3810 * Introducing the Firebird adapter. Quote columns and use attribute_condition more consistently. Setup guide: http://wiki.rubyonrails.com/rails/pages/Firebird+Adapter #1874 [Ken Kunz <kennethkunz@gmail.com>]
3811
3812 * SQLServer: active? and reconnect! methods for handling stale connections. #428 [kajism@yahoo.com, Tom Ward <tom@popdog.net>]
3813
3814 * Associations handle case-equality more consistently: item.parts.is_a?(Array) and item.parts === Array. #1345 [MarkusQ@reality.com]
3815
3816 * SQLServer: insert uses given primary key value if not nil rather than SELECT @@IDENTITY. #2866 [kajism@yahoo.com, Tom Ward <tom@popdog.net>]
3817
3818 * Oracle: active? and reconnect! methods for handling stale connections. Optionally retry queries after reconnect. #428 [Michael Schoen <schoenm@earthlink.net>]
3819
3820 * Correct documentation for Base.delete_all. #1568 [Newhydra]
3821
3822 * Oracle: test case for column default parsing. #2788 [Michael Schoen <schoenm@earthlink.net>]
3823
3824 * Update documentation for Migrations. #2861 [Tom Werner <tom@cube6media.com>]
3825
3826 * When AbstractAdapter#log rescues an exception, attempt to detect and reconnect to an inactive database connection. Connection adapter must respond to the active? and reconnect! instance methods. Initial support for PostgreSQL, MySQL, and SQLite. Make certain that all statements which may need reconnection are performed within a logged block: for example, this means no avoiding log(sql, name) { } if @logger.nil? #428 [Jeremy Kemper]
3827
3828 * Oracle: Much faster column reflection. #2848 [Michael Schoen <schoenm@earthlink.net>]
3829
3830 * Base.reset_sequence_name analogous to reset_table_name (mostly useful for testing). Base.define_attr_method allows nil values. [Jeremy Kemper]
3831
3832 * PostgreSQL: smarter sequence name defaults, stricter last_insert_id, warn on pk without sequence. [Jeremy Kemper]
3833
3834 * PostgreSQL: correctly discover custom primary key sequences. #2594 [Blair Zajac <blair@orcaware.com>, meadow.nnick@gmail.com, Jeremy Kemper]
3835
3836 * SQLServer: don't report limits for unsupported field types. #2835 [Ryan Tomayko]
3837
3838 * Include the Enumerable module in ActiveRecord::Errors. [Rick Bradley <rick@rickbradley.com>]
3839
3840 * Add :group option, correspond to GROUP BY, to the find method and to the has_many association. #2818 [rubyonrails@atyp.de]
3841
3842 * Don't cast nil or empty strings to a dummy date. #2789 [Rick Bradley <rick@rickbradley.com>]
3843
3844 * acts_as_list plays nicely with inheritance by remembering the class which declared it. #2811 [rephorm@rephorm.com]
3845
3846 * Fix sqlite adaptor's detection of missing dbfile or database declaration. [Nicholas Seckar]
3847
3848 * Fixed acts_as_list for definitions without an explicit :order #2803 [Jonathan Viney]
3849
3850 * Upgrade bundled ruby-mysql 0.2.4 with mysql411 shim (see #440) to ruby-mysql 0.2.6 with a patchset for 4.1 protocol support. Local change [301] is now a part of the main driver; reapplied local change [2182]. Removed GC.start from Result.free. [tommy@tmtm.org, akuroda@gmail.com, Doug Fales <doug.fales@gmail.com>, Jeremy Kemper]
3851
3852 * Correct handling of complex order clauses with SQL Server limit emulation. #2770 [Tom Ward <tom@popdog.net>, Matt B.]
3853
3854 * Correct whitespace problem in Oracle default column value parsing. #2788 [rick@rickbradley.com]
3855
3856 * Destroy associated has_and_belongs_to_many records after all before_destroy callbacks but before destroy. This allows you to act on the habtm association as you please while preserving referential integrity. #2065 [larrywilliams1@gmail.com, sam.kirchmeier@gmail.com, elliot@townx.org, Jeremy Kemper]
3857
3858 * Deprecate the old, confusing :exclusively_dependent option in favor of :dependent => :delete_all. [Jeremy Kemper]
3859
3860 * More compatible Oracle column reflection. #2771 [Ryan Davis <ryand-ruby@zenspider.com>, Michael Schoen <schoenm@earthlink.net>]
3861
3862
3863 *1.13.0* (November 7th, 2005)
3864
3865 * Fixed faulty regex in get_table_name method (SQLServerAdapter) #2639 [Ryan Tomayko]
3866
3867 * Added :include as an option for association declarations [David Heinemeier Hansson]. Example:
3868
3869 has_many :posts, :include => [ :author, :comments ]
3870
3871 * Rename Base.constrain to Base.with_scope so it doesn't conflict with existing concept of database constraints. Make scoping more robust: uniform method => parameters, validated method names and supported finder parameters, raise exception on nested scopes. [Jeremy Kemper] Example:
3872
3873 Comment.with_scope(:find => { :conditions => 'active=true' }, :create => { :post_id => 5 }) do
3874 # Find where name = ? and active=true
3875 Comment.find :all, :conditions => ['name = ?', name]
3876 # Create comment associated with :post_id
3877 Comment.create :body => "Hello world"
3878 end
3879
3880 * Fixed that SQL Server should ignore :size declarations on anything but integer and string in the agnostic schema representation #2756 [Ryan Tomayko]
3881
3882 * Added constrain scoping for creates using a hash of attributes bound to the :creation key [David Heinemeier Hansson]. Example:
3883
3884 Comment.constrain(:creation => { :post_id => 5 }) do
3885 # Associated with :post_id
3886 Comment.create :body => "Hello world"
3887 end
3888
3889 This is rarely used directly, but allows for find_or_create on associations. So you can do:
3890
3891 # If the tag doesn't exist, a new one is created that's associated with the person
3892 person.tags.find_or_create_by_name("Summer")
3893
3894 * Added find_or_create_by_X as a second type of dynamic finder that'll create the record if it doesn't already exist [David Heinemeier Hansson]. Example:
3895
3896 # No 'Summer' tag exists
3897 Tag.find_or_create_by_name("Summer") # equal to Tag.create(:name => "Summer")
3898
3899 # Now the 'Summer' tag does exist
3900 Tag.find_or_create_by_name("Summer") # equal to Tag.find_by_name("Summer")
3901
3902 * Added extension capabilities to has_many and has_and_belongs_to_many proxies [David Heinemeier Hansson]. Example:
3903
3904 class Account < ActiveRecord::Base
3905 has_many :people do
3906 def find_or_create_by_name(name)
3907 first_name, *last_name = name.split
3908 last_name = last_name.join " "
3909
3910 find_or_create_by_first_name_and_last_name(first_name, last_name)
3911 end
3912 end
3913 end
3914
3915 person = Account.find(:first).people.find_or_create_by_name("David Heinemeier Hansson")
3916 person.first_name # => "David"
3917 person.last_name # => "Heinemeier Hansson"
3918
3919 Note that the anoymous module must be declared using brackets, not do/end (due to order of evaluation).
3920
3921 * Omit internal dtproperties table from SQLServer table list. #2729 [Ryan Tomayko]
3922
3923 * Quote column names in generated SQL. #2728 [Ryan Tomayko]
3924
3925 * Correct the pure-Ruby MySQL 4.1.1 shim's version test. #2718 [Jeremy Kemper]
3926
3927 * Add Model.create! to match existing model.save! method. When save! raises RecordInvalid, you can catch the exception, retrieve the invalid record (invalid_exception.record), and see its errors (invalid_exception.record.errors). [Jeremy Kemper]
3928
3929 * Correct fixture behavior when table name pluralization is off. #2719 [Rick Bradley <rick@rickbradley.com>]
3930
3931 * Changed :dbfile to :database for SQLite adapter for consistency (old key still works as an alias) #2644 [Dan Peterson]
3932
3933 * Added migration support for Oracle #2647 [Michael Schoen]
3934
3935 * Worked around that connection can't be reset if allow_concurrency is off. #2648 [Michael Schoen <schoenm@earthlink.net>]
3936
3937 * Fixed SQL Server adapter to pass even more tests and do even better #2634 [Ryan Tomayko]
3938
3939 * Fixed SQL Server adapter so it honors options[:conditions] when applying :limits #1978 [Tom Ward]
3940
3941 * Added migration support to SQL Server adapter (please someone do the same for Oracle and DB2) #2625 [Tom Ward]
3942
3943 * Use AR::Base.silence rather than AR::Base.logger.silence in fixtures to preserve Log4r compatibility. #2618 [dansketcher@gmail.com]
3944
3945 * Constraints are cloned so they can't be inadvertently modified while they're
3946 in effect. Added :readonly finder constraint. Calling an association collection's class method (Part.foobar via item.parts.foobar) constrains :readonly => false since the collection's :joins constraint would otherwise force it to true. [Jeremy Kemper <rails@bitsweat.net>]
3947
3948 * Added :offset and :limit to the kinds of options that Base.constrain can use #2466 [duane.johnson@gmail.com]
3949
3950 * Fixed handling of nil number columns on Oracle and cleaned up tests for Oracle in general #2555 [Michael Schoen]
3951
3952 * Added quoted_true and quoted_false methods and tables to db2_adapter and cleaned up tests for DB2 #2493, #2624 [maik schmidt]
3953
3954
3955 *1.12.2* (October 26th, 2005)
3956
3957 * Allow symbols to rename columns when using SQLite adapter. #2531 [Kevin Clark]
3958
3959 * Map Active Record time to SQL TIME. #2575, #2576 [Robby Russell <robby@planetargon.com>]
3960
3961 * Clarify semantics of ActiveRecord::Base#respond_to? #2560 [Stefan Kaes]
3962
3963 * Fixed Association#clear for associations which have not yet been accessed. #2524 [Patrick Lenz <patrick@lenz.sh>]
3964
3965 * HABTM finders shouldn't return readonly records. #2525 [Patrick Lenz <patrick@lenz.sh>]
3966
3967 * Make all tests runnable on their own. #2521. [Blair Zajac <blair@orcaware.com>]
3968
3969
3970 *1.12.1* (October 19th, 2005)
3971
3972 * Always parenthesize :conditions options so they may be safely combined with STI and constraints.
3973
3974 * Correct PostgreSQL primary key sequence detection. #2507 [tmornini@infomania.com]
3975
3976 * Added support for using limits in eager loads that involve has_many and has_and_belongs_to_many associations
3977
3978
3979 *1.12.0* (October 16th, 2005)
3980
3981 * Update/clean up documentation (rdoc)
3982
3983 * PostgreSQL sequence support. Use set_sequence_name in your model class to specify its primary key sequence. #2292 [Rick Olson <technoweenie@gmail.com>, Robby Russell <robby@planetargon.com>]
3984
3985 * Change default logging colors to work on both white and black backgrounds. [Sam Stephenson]
3986
3987 * YAML fixtures support ordered hashes for fixtures with foreign key dependencies in the same table. #1896 [purestorm@ggnore.net]
3988
3989 * :dependent now accepts :nullify option. Sets the foreign key of the related objects to NULL instead of deleting them. #2015 [Robby Russell <robby@planetargon.com>]
3990
3991 * Introduce read-only records. If you call object.readonly! then it will mark the object as read-only and raise ReadOnlyRecord if you call object.save. object.readonly? reports whether the object is read-only. Passing :readonly => true to any finder method will mark returned records as read-only. The :joins option now implies :readonly, so if you use this option, saving the same record will now fail. Use find_by_sql to work around.
3992
3993 * Avoid memleak in dev mode when using fcgi
3994
3995 * Simplified .clear on active record associations by using the existing delete_records method. #1906 [Caleb <me@cpb.ca>]
3996
3997 * Delegate access to a customized primary key to the conventional id method. #2444. [Blair Zajac <blair@orcaware.com>]
3998
3999 * Fix errors caused by assigning a has-one or belongs-to property to itself
4000
4001 * Add ActiveRecord::Base.schema_format setting which specifies how databases should be dumped [Sam Stephenson]
4002
4003 * Update DB2 adapter. #2206. [contact@maik-schmidt.de]
4004
4005 * Corrections to SQLServer native data types. #2267. [rails.20.clarry@spamgourmet.com]
4006
4007 * Deprecated ActiveRecord::Base.threaded_connection in favor of ActiveRecord::Base.allow_concurrency.
4008
4009 * Protect id attribute from mass assigment even when the primary key is set to something else. #2438. [Blair Zajac <blair@orcaware.com>]
4010
4011 * Misc doc fixes (typos/grammar/etc.). #2430. [coffee2code]
4012
4013 * Add test coverage for content_columns. #2432. [coffee2code]
4014
4015 * Speed up for unthreaded environments. #2431. [Stefan Kaes]
4016
4017 * Optimization for Mysql selects using mysql-ruby extension greater than 2.6.3. #2426. [Stefan Kaes]
4018
4019 * Speed up the setting of table_name. #2428. [Stefan Kaes]
4020
4021 * Optimize instantiation of STI subclass records. In partial fullfilment of #1236. [Stefan Kaes]
4022
4023 * Fix typo of 'constrains' to 'contraints'. #2069. [Michael Schuerig <michael@schuerig.de>]
4024
4025 * Optimization refactoring for add_limit_offset!. In partial fullfilment of #1236. [Stefan Kaes]
4026
4027 * Add ability to get all siblings, including the current child, with acts_as_tree. Recloses #2140. [Michael Schuerig <michael@schuerig.de>]
4028
4029 * Add geometric type for postgresql adapter. #2233 [Andrew Kaspick]
4030
4031 * Add option (true by default) to generate reader methods for each attribute of a record to avoid the overhead of calling method missing. In partial fullfilment of #1236. [Stefan Kaes]
4032
4033 * Add convenience predicate methods on Column class. In partial fullfilment of #1236. [Stefan Kaes]
4034
4035 * Raise errors when invalid hash keys are passed to ActiveRecord::Base.find. #2363 [Chad Fowler <chad@chadfowler.com>, Nicholas Seckar]
4036
4037 * Added :force option to create_table that'll try to drop the table if it already exists before creating
4038
4039 * Fix transactions so that calling return while inside a transaction will not leave an open transaction on the connection. [Nicholas Seckar]
4040
4041 * Use foreign_key inflection uniformly. #2156 [Blair Zajac <blair@orcaware.com>]
4042
4043 * model.association.clear should destroy associated objects if :dependent => true instead of nullifying their foreign keys. #2221 [joergd@pobox.com, ObieFernandez <obiefernandez@gmail.com>]
4044
4045 * Returning false from before_destroy should cancel the action. #1829 [Jeremy Huffman]
4046
4047 * Recognize PostgreSQL NOW() default as equivalent to CURRENT_TIMESTAMP or CURRENT_DATE, depending on the column's type. #2256 [mat <mat@absolight.fr>]
4048
4049 * Extensive documentation for the abstract database adapter. #2250 [François Beausoleil <fbeausoleil@ftml.net>]
4050
4051 * Clean up Fixtures.reset_sequences for PostgreSQL. Handle tables with no rows and models with custom primary keys. #2174, #2183 [jay@jay.fm, Blair Zajac <blair@orcaware.com>]
4052
4053 * Improve error message when nil is assigned to an attr which validates_size_of within a range. #2022 [Manuel Holtgrewe <purestorm@ggnore.net>]
4054
4055 * Make update_attribute use the same writer method that update_attributes uses.
4056 #2237 [trevor@protocool.com]
4057
4058 * Make migrations honor table name prefixes and suffixes. #2298 [Jakob Skjerning, Marcel Molina Jr.]
4059
4060 * Correct and optimize PostgreSQL bytea escaping. #1745, #1837 [dave@cherryville.org, ken@miriamtech.com, bellis@deepthought.org]
4061
4062 * Fixtures should only reset a PostgreSQL sequence if it corresponds to an integer primary key named id. #1749 [chris@chrisbrinker.com]
4063
4064 * Standardize the interpretation of boolean columns in the Mysql and Sqlite adapters. (Use MysqlAdapter.emulate_booleans = false to disable this behavior)
4065
4066 * Added new symbol-driven approach to activating observers with Base#observers= [David Heinemeier Hansson]. Example:
4067
4068 ActiveRecord::Base.observers = :cacher, :garbage_collector
4069
4070 * Added AbstractAdapter#select_value and AbstractAdapter#select_values as convenience methods for selecting single values, instead of hashes, of the first column in a SELECT #2283 [solo@gatelys.com]
4071
4072 * Wrap :conditions in parentheses to prevent problems with OR's #1871 [Jamis Buck]
4073
4074 * Allow the postgresql adapter to work with the SchemaDumper. [Jamis Buck]
4075
4076 * Add ActiveRecord::SchemaDumper for dumping a DB schema to a pure-ruby file, making it easier to consolidate large migration lists and port database schemas between databases. [Jamis Buck]
4077
4078 * Fixed migrations for Windows when using more than 10 [David Naseby]
4079
4080 * Fixed that the create_x method from belongs_to wouldn't save the association properly #2042 [Florian Weber]
4081
4082 * Fixed saving a record with two unsaved belongs_to associations pointing to the same object #2023 [Tobias Lütke]
4083
4084 * Improved migrations' behavior when the schema_info table is empty. [Nicholas Seckar]
4085
4086 * Fixed that Observers didn't observe sub-classes #627 [Florian Weber]
4087
4088 * Fix eager loading error messages, allow :include to specify tables using strings or symbols. Closes #2222 [Marcel Molina Jr.]
4089
4090 * Added check for RAILS_CONNECTION_ADAPTERS on startup and only load the connection adapters specified within if its present (available in Rails through config.connection_adapters using the new config) #1958 [skae]
4091
4092 * Fixed various problems with has_and_belongs_to_many when using customer finder_sql #2094 [Florian Weber]
4093
4094 * Added better exception error when unknown column types are used with migrations #1814 [François Beausoleil]
4095
4096 * Fixed "connection lost" issue with the bundled Ruby/MySQL driver (would kill the app after 8 hours of inactivity) #2163, #428 [kajism@yahoo.com]
4097
4098 * Fixed comparison of Active Record objects so two new objects are not equal #2099 [deberg]
4099
4100 * Fixed that the SQL Server adapter would sometimes return DBI::Timestamp objects instead of Time #2127 [Tom Ward]
4101
4102 * Added the instance methods #root and #ancestors on acts_as_tree and fixed siblings to not include the current node #2142, #2140 [coffee2code]
4103
4104 * Fixed that Active Record would call SHOW FIELDS twice (or more) for the same model when the cached results were available #1947 [sd@notso.net]
4105
4106 * Added log_level and use_silence parameter to ActiveRecord::Base.benchmark. The first controls at what level the benchmark statement will be logged (now as debug, instead of info) and the second that can be passed false to include all logging statements during the benchmark block/
4107
4108 * Make sure the schema_info table is created before querying the current version #1903
4109
4110 * Fixtures ignore table name prefix and suffix #1987 [Jakob Skjerning]
4111
4112 * Add documentation for index_type argument to add_index method for migrations #2005 [Blaine]
4113
4114 * Modify read_attribute to allow a symbol argument #2024 [Ken Kunz]
4115
4116 * Make destroy return self #1913 [Sebastian Kanthak]
4117
4118 * Fix typo in validations documentation #1938 [court3nay]
4119
4120 * Make acts_as_list work for insert_at(1) #1966 [hensleyl@papermountain.org]
4121
4122 * Fix typo in count_by_sql documentation #1969 [Alexey Verkhovsky]
4123
4124 * Allow add_column and create_table to specify NOT NULL #1712 [emptysands@gmail.com]
4125
4126 * Fix create_table so that id column is implicitly added [Rick Olson]
4127
4128 * Default sequence names for Oracle changed to #{table_name}_seq, which is the most commonly used standard. In addition, a new method ActiveRecord::Base#set_sequence_name allows the developer to set the sequence name per model. This is a non-backwards-compatible change -- anyone using the old-style "rails_sequence" will need to either create new sequences, or set: ActiveRecord::Base.set_sequence_name = "rails_sequence" #1798
4129
4130 * OCIAdapter now properly handles synonyms, which are commonly used to separate out the schema owner from the application user #1798
4131
4132 * Fixed the handling of camelCase columns names in Oracle #1798
4133
4134 * Implemented for OCI the Rakefile tasks of :clone_structure_to_test, :db_structure_dump, and :purge_test_database, which enable Oracle folks to enjoy all the agile goodness of Rails for testing. Note that the current implementation is fairly limited -- only tables and sequences are cloned, not constraints or indexes. A full clone in Oracle generally requires some manual effort, and is version-specific. Post 9i, Oracle recommends the use of the DBMS_METADATA package, though that approach requires editing of the physical characteristics generated #1798
4135
4136 * Fixed the handling of multiple blob columns in Oracle if one or more of them are null #1798
4137
4138 * Added support for calling constrained class methods on has_many and has_and_belongs_to_many collections #1764 [Tobias Lütke]
4139
4140 class Comment < AR:B
4141 def self.search(q)
4142 find(:all, :conditions => ["body = ?", q])
4143 end
4144 end
4145
4146 class Post < AR:B
4147 has_many :comments
4148 end
4149
4150 Post.find(1).comments.search('hi') # => SELECT * from comments WHERE post_id = 1 AND body = 'hi'
4151
4152 NOTICE: This patch changes the underlying SQL generated by has_and_belongs_to_many queries. If your relying on that, such as
4153 by explicitly referencing the old t and j aliases, you'll need to update your code. Of course, you _shouldn't_ be relying on
4154 details like that no less than you should be diving in to touch private variables. But just in case you do, consider yourself
4155 noticed :)
4156
4157 * Added migration support for SQLite (using temporary tables to simulate ALTER TABLE) #1771 [Sam Stephenson]
4158
4159 * Remove extra definition of supports_migrations? from abstract_adaptor.rb [Nicholas Seckar]
4160
4161 * Fix acts_as_list so that moving next-to-last item to the bottom does not result in duplicate item positions
4162
4163 * Fixed incompatibility in DB2 adapter with the new limit/offset approach #1718 [Maik Schmidt]
4164
4165 * Added :select option to find which can specify a different value than the default *, like find(:all, :select => "first_name, last_name"), if you either only want to select part of the columns or exclude columns otherwise included from a join #1338 [Stefan Kaes]
4166
4167
4168 *1.11.1* (11 July, 2005)
4169
4170 * Added support for limit and offset with eager loading of has_one and belongs_to associations. Using the options with has_many and has_and_belongs_to_many associations will now raise an ActiveRecord::ConfigurationError #1692 [Rick Olson]
4171
4172 * Fixed that assume_bottom_position (in acts_as_list) could be called on items already last in the list and they would move one position away from the list #1648 [tyler@kianta.com]
4173
4174 * Added ActiveRecord::Base.threaded_connections flag to turn off 1-connection per thread (required for thread safety). By default it's on, but WEBrick in Rails need it off #1685 [Sam Stephenson]
4175
4176 * Correct reflected table name for singular associations. #1688 [court3nay]
4177
4178 * Fixed optimistic locking with SQL Server #1660 [tom@popdog.net]
4179
4180 * Added ActiveRecord::Migrator.migrate that can figure out whether to go up or down based on the target version and the current
4181
4182 * Added better error message for "packets out of order" #1630 [court3nay]
4183
4184 * Fixed first run of "rake migrate" on PostgreSQL by not expecting a return value on the id #1640
4185
4186
4187 *1.11.0* (6 July, 2005)
4188
4189 * Fixed that Yaml error message in fixtures hid the real error #1623 [Nicholas Seckar]
4190
4191 * Changed logging of SQL statements to use the DEBUG level instead of INFO
4192
4193 * Added new Migrations framework for describing schema transformations in a way that can be easily applied across multiple databases #1604 [Tobias Lütke] See documentation under ActiveRecord::Migration and the additional support in the Rails rakefile/generator.
4194
4195 * Added callback hooks to association collections #1549 [Florian Weber]. Example:
4196
4197 class Project
4198 has_and_belongs_to_many :developers, :before_add => :evaluate_velocity
4199
4200 def evaluate_velocity(developer)
4201 ...
4202 end
4203 end
4204
4205 ..raising an exception will cause the object not to be added (or removed, with before_remove).
4206
4207
4208 * Fixed Base.content_columns call for SQL Server adapter #1450 [DeLynn Berry]
4209
4210 * Fixed Base#write_attribute to work with both symbols and strings #1190 [Paul Legato]
4211
4212 * Fixed that has_and_belongs_to_many didn't respect single table inheritance types #1081 [Florian Weber]
4213
4214 * Speed up ActiveRecord#method_missing for the common case (read_attribute).
4215
4216 * Only notify observers on after_find and after_initialize if these methods are defined on the model. #1235 [Stefan Kaes]
4217
4218 * Fixed that single-table inheritance sub-classes couldn't be used to limit the result set with eager loading #1215 [Chris McGrath]
4219
4220 * Fixed validates_numericality_of to work with overrided getter-method when :allow_nil is on #1316 [raidel@onemail.at]
4221
4222 * Added roots, root, and siblings to the batch of methods added by acts_as_tree #1541 [Michael Schuerig]
4223
4224 * Added support for limit/offset with the MS SQL Server driver so that pagination will now work #1569 [DeLynn Berry]
4225
4226 * Added support for ODBC connections to MS SQL Server so you can connect from a non-Windows machine #1569 [Mark Imbriaco/DeLynn Berry]
4227
4228 * Fixed that multiparameter posts ignored attr_protected #1532 [alec+rails@veryclever.net]
4229
4230 * Fixed problem with eager loading when using a has_and_belongs_to_many association using :association_foreign_key #1504 [flash@vanklinkenbergsoftware.nl]
4231
4232 * Fixed Base#find to honor the documentation on how :joins work and make them consistent with Base#count #1405 [pritchie@gmail.com]. What used to be:
4233
4234 Developer.find :all, :joins => 'developers_projects', :conditions => 'id=developer_id AND project_id=1'
4235
4236 ...should instead be:
4237
4238 Developer.find(
4239 :all,
4240 :joins => 'LEFT JOIN developers_projects ON developers.id = developers_projects.developer_id',
4241 :conditions => 'project_id=1'
4242 )
4243
4244 * Fixed that validations didn't respecting custom setting for too_short, too_long messages #1437 [Marcel Molina Jr.]
4245
4246 * Fixed that clear_association_cache doesn't delete new associations on new records (so you can safely place new records in the session with Action Pack without having new associations wiped) #1494 [cluon]
4247
4248 * Fixed that calling Model.find([]) returns [] and doesn't throw an exception #1379
4249
4250 * Fixed that adding a record to a has_and_belongs_to collection would always save it -- now it only saves if its a new record #1203 [Alisdair McDiarmid]
4251
4252 * Fixed saving of in-memory association structures to happen as a after_create/after_update callback instead of after_save -- that way you can add new associations in after_create/after_update callbacks without getting them saved twice
4253
4254 * Allow any Enumerable, not just Array, to work as bind variables #1344 [Jeremy Kemper]
4255
4256 * Added actual database-changing behavior to collection assigment for has_many and has_and_belongs_to_many #1425 [Sebastian Kanthak].
4257 Example:
4258
4259 david.projects = [Project.find(1), Project.new("name" => "ActionWebSearch")]
4260 david.save
4261
4262 If david.projects already contain the project with ID 1, this is left unchanged. Any other projects are dropped. And the new
4263 project is saved when david.save is called.
4264
4265 Also included is a way to do assignments through IDs, which is perfect for checkbox updating, so you get to do:
4266
4267 david.project_ids = [1, 5, 7]
4268
4269 * Corrected typo in find SQL for has_and_belongs_to_many. #1312 [ben@bensinclair.com]
4270
4271 * Fixed sanitized conditions for has_many finder method. #1281 [jackc@hylesanderson.com, pragdave, Tobias Lütke]
4272
4273 * Comprehensive PostgreSQL schema support. Use the optional schema_search_path directive in database.yml to give a comma-separated list of schemas to search for your tables. This allows you, for example, to have tables in a shared schema without having to use a custom table name. See http://www.postgresql.org/docs/8.0/interactive/ddl-schemas.html to learn more. #827 [dave@cherryville.org]
4274
4275 * Corrected @@configurations typo #1410 [david@ruppconsulting.com]
4276
4277 * Return PostgreSQL columns in the order they were declared #1374 [perlguy@gmail.com]
4278
4279 * Allow before/after update hooks to work on models using optimistic locking
4280
4281 * Eager loading of dependent has_one associations won't delete the association #1212
4282
4283 * Added a second parameter to the build and create method for has_one that controls whether the existing association should be replaced (which means nullifying its foreign key as well). By default this is true, but false can be passed to prevent it.
4284
4285 * Using transactional fixtures now causes the data to be loaded only once.
4286
4287 * Added fixture accessor methods that can be used when instantiated fixtures are disabled.
4288
4289 fixtures :web_sites
4290
4291 def test_something
4292 assert_equal "Ruby on Rails", web_sites(:rubyonrails).name
4293 end
4294
4295 * Added DoubleRenderError exception that'll be raised if render* is called twice #518 [Nicholas Seckar]
4296
4297 * Fixed exceptions occuring after render has been called #1096 [Nicholas Seckar]
4298
4299 * CHANGED: validates_presence_of now uses Errors#add_on_blank, which will make " " fail the validation where it didn't before #1309
4300
4301 * Added Errors#add_on_blank which works like Errors#add_on_empty, but uses Object#blank? instead
4302
4303 * Added the :if option to all validations that can either use a block or a method pointer to determine whether the validation should be run or not. #1324 [Duane Johnson/jhosteny]. Examples:
4304
4305 Conditional validations such as the following are made possible:
4306 validates_numericality_of :income, :if => :employed?
4307
4308 Conditional validations can also solve the salted login generator problem:
4309 validates_confirmation_of :password, :if => :new_password?
4310
4311 Using blocks:
4312 validates_presence_of :username, :if => Proc.new { |user| user.signup_step > 1 }
4313
4314 * Fixed use of construct_finder_sql when using :join #1288 [dwlt@dwlt.net]
4315
4316 * Fixed that :delete_sql in has_and_belongs_to_many associations couldn't access record properties #1299 [Rick Olson]
4317
4318 * Fixed that clone would break when an aggregate had the same name as one of its attributes #1307 [Jeremy Kemper]
4319
4320 * Changed that destroying an object will only freeze the attributes hash, which keeps the object from having attributes changed (as that wouldn't make sense), but allows for the querying of associations after it has been destroyed.
4321
4322 * Changed the callbacks such that observers are notified before the in-object callbacks are triggered. Without this change, it wasn't possible to act on the whole object in something like a before_destroy observer without having the objects own callbacks (like deleting associations) called first.
4323
4324 * Added option for passing an array to the find_all version of the dynamic finders and have it evaluated as an IN fragment. Example:
4325
4326 # SELECT * FROM topics WHERE title IN ('First', 'Second')
4327 Topic.find_all_by_title(["First", "Second"])
4328
4329 * Added compatibility with camelCase column names for dynamic finders #533 [Dee Zsombor]
4330
4331 * Fixed extraneous comma in count() function that made it not work with joins #1156 [Jarkko Laine/Dee Zsombor]
4332
4333 * Fixed incompatibility with Base#find with an array of ids that would fail when using eager loading #1186 [Alisdair McDiarmid]
4334
4335 * Fixed that validate_length_of lost :on option when :within was specified #1195 [jhosteny@mac.com]
4336
4337 * Added encoding and min_messages options for PostgreSQL #1205 [Shugo Maeda]. Configuration example:
4338
4339 development:
4340 adapter: postgresql
4341 database: rails_development
4342 host: localhost
4343 username: postgres
4344 password:
4345 encoding: UTF8
4346 min_messages: ERROR
4347
4348 * Fixed acts_as_list where deleting an item that was removed from the list would ruin the positioning of other list items #1197 [Jamis Buck]
4349
4350 * Added validates_exclusion_of as a negative of validates_inclusion_of
4351
4352 * Optimized counting of has_many associations by setting the association to empty if the count is 0 so repeated calls doesn't trigger database calls
4353
4354
4355 *1.10.1* (20th April, 2005)
4356
4357 * Fixed frivilous database queries being triggered with eager loading on empty associations and other things
4358
4359 * Fixed order of loading in eager associations
4360
4361 * Fixed stray comma when using eager loading and ordering together from has_many associations #1143
4362
4363
4364 *1.10.0* (19th April, 2005)
4365
4366 * Added eager loading of associations as a way to solve the N+1 problem more gracefully without piggy-back queries. Example:
4367
4368 for post in Post.find(:all, :limit => 100)
4369 puts "Post: " + post.title
4370 puts "Written by: " + post.author.name
4371 puts "Last comment on: " + post.comments.first.created_on
4372 end
4373
4374 This used to generate 301 database queries if all 100 posts had both author and comments. It can now be written as:
4375
4376 for post in Post.find(:all, :limit => 100, :include => [ :author, :comments ])
4377
4378 ...and the number of database queries needed is now 1.
4379
4380 * Added new unified Base.find API and deprecated the use of find_first and find_all. See the documentation for Base.find. Examples:
4381
4382 Person.find(1, :conditions => "administrator = 1", :order => "created_on DESC")
4383 Person.find(1, 5, 6, :conditions => "administrator = 1", :order => "created_on DESC")
4384 Person.find(:first, :order => "created_on DESC", :offset => 5)
4385 Person.find(:all, :conditions => [ "category IN (?)", categories], :limit => 50)
4386 Person.find(:all, :offset => 10, :limit => 10)
4387
4388 * Added acts_as_nested_set #1000 [wschenk]. Introduction:
4389
4390 This acts provides Nested Set functionality. Nested Set is similiar to Tree, but with
4391 the added feature that you can select the children and all of it's descendants with
4392 a single query. A good use case for this is a threaded post system, where you want
4393 to display every reply to a comment without multiple selects.
4394
4395 * Added Base.save! that attempts to save the record just like Base.save but will raise a RecordInvalid exception instead of returning false if the record is not valid [Dave Thomas]
4396
4397 * Fixed PostgreSQL usage of fixtures with regards to public schemas and table names with dots #962 [gnuman1@gmail.com]
4398
4399 * Fixed that fixtures were being deleted in the same order as inserts causing FK errors #890 [andrew.john.peters@gmail.com]
4400
4401 * Fixed loading of fixtures in to be in the right order (or PostgreSQL would bark) #1047 [stephenh@chase3000.com]
4402
4403 * Fixed page caching for non-vhost applications living underneath the root #1004 [Ben Schumacher]
4404
4405 * Fixes a problem with the SQL Adapter which was resulting in IDENTITY_INSERT not being set to ON when it should be #1104 [adelle]
4406
4407 * Added the option to specify the acceptance string in validates_acceptance_of #1106 [caleb@aei-tech.com]
4408
4409 * Added insert_at(position) to acts_as_list #1083 [DeLynnB]
4410
4411 * Removed the default order by id on has_and_belongs_to_many queries as it could kill performance on large sets (you can still specify by hand with :order)
4412
4413 * Fixed that Base.silence should restore the old logger level when done, not just set it to DEBUG #1084 [yon@milliped.com]
4414
4415 * Fixed boolean saving on Oracle #1093 [mparrish@pearware.org]
4416
4417 * Moved build_association and create_association for has_one and belongs_to out of deprecation as they work when the association is nil unlike association.build and association.create, which require the association to be already in place #864
4418
4419 * Added rollbacks of transactions if they're active as the dispatcher is killed gracefully (TERM signal) #1054 [Leon Bredt]
4420
4421 * Added quoting of column names for fixtures #997 [jcfischer@gmail.com]
4422
4423 * Fixed counter_sql when no records exist in database for PostgreSQL (would give error, not 0) #1039 [Caleb Tennis]
4424
4425 * Fixed that benchmarking times for rendering included db runtimes #987 [Stefan Kaes]
4426
4427 * Fixed boolean queries for t/f fields in PostgreSQL #995 [dave@cherryville.org]
4428
4429 * Added that model.items.delete(child) will delete the child, not just set the foreign key to nil, if the child is dependent on the model #978 [Jeremy Kemper]
4430
4431 * Fixed auto-stamping of dates (created_on/updated_on) for PostgreSQL #985 [dave@cherryville.org]
4432
4433 * Fixed Base.silence/benchmark to only log if a logger has been configured #986 [Stefan Kaes]
4434
4435 * Added a join parameter as the third argument to Base.find_first and as the second to Base.count #426, #988 [Stefan Kaes]
4436
4437 * Fixed bug in Base#hash method that would treat records with the same string-based id as different [Dave Thomas]
4438
4439 * Renamed DateHelper#distance_of_time_in_words_to_now to DateHelper#time_ago_in_words (old method name is still available as a deprecated alias)
4440
4441
4442 *1.9.1* (27th March, 2005)
4443
4444 * Fixed that Active Record objects with float attribute could not be cloned #808
4445
4446 * Fixed that MissingSourceFile's wasn't properly detected in production mode #925 [Nicholas Seckar]
4447
4448 * Fixed that :counter_cache option would look for a line_items_count column for a LineItem object instead of lineitems_count
4449
4450 * Fixed that AR exists?() would explode on postgresql if the passed id did not match the PK type #900 [Scott Barron]
4451
4452 * Fixed the MS SQL adapter to work with the new limit/offset approach and with binary data (still suffering from 7KB limit, though) #901 [delynnb]
4453
4454
4455 *1.9.0* (22th March, 2005)
4456
4457 * Added adapter independent limit clause as a two-element array with the first being the limit, the second being the offset #795 [Sam Stephenson]. Example:
4458
4459 Developer.find_all nil, 'id ASC', 5 # return the first five developers
4460 Developer.find_all nil, 'id ASC', [3, 8] # return three developers, starting from #8 and forward
4461
4462 This doesn't yet work with the DB2 or MS SQL adapters. Patches to make that happen are encouraged.
4463
4464 * Added alias_method :to_param, :id to Base, such that Active Record objects to be used as URL parameters in Action Pack automatically #812 [Nicholas Seckar/Sam Stephenson]
4465
4466 * Improved the performance of the OCI8 adapter for Oracle #723 [pilx/gjenkins]
4467
4468 * Added type conversion before saving a record, so string-based values like "10.0" aren't left for the database to convert #820 [dave@cherryville.org]
4469
4470 * Added with additional settings for working with transactional fixtures and pre-loaded test databases #865 [mindel]
4471
4472 * Fixed acts_as_list to trigger remove_from_list on destroy after the fact, not before, so a unique position can be maintained #871 [Alisdair McDiarmid]
4473
4474 * Added the possibility of specifying fixtures in multiple calls #816 [kim@tinker.com]
4475
4476 * Added Base.exists?(id) that'll return true if an object of the class with the given id exists #854 [stian@grytoyr.net]
4477
4478 * Added optionally allow for nil or empty strings with validates_numericality_of #801 [Sebastian Kanthak]
4479
4480 * Fixed problem with using slashes in validates_format_of regular expressions #801 [Sebastian Kanthak]
4481
4482 * Fixed that SQLite3 exceptions are caught and reported properly #823 [yerejm]
4483
4484 * Added that all types of after_find/after_initialized callbacks are triggered if the explicit implementation is present, not only the explicit implementation itself
4485
4486 * Fixed that symbols can be used on attribute assignment, like page.emails.create(:subject => data.subject, :body => data.body)
4487
4488
4489 *1.8.0* (7th March, 2005)
4490
4491 * Added ActiveRecord::Base.colorize_logging to control whether to use colors in logs or not (on by default)
4492
4493 * Added support for timestamp with time zone in PostgreSQL #560 [Scott Barron]
4494
4495 * Added MultiparameterAssignmentErrors and AttributeAssignmentError exceptions #777 [demetrius]. Documentation:
4496
4497 * +MultiparameterAssignmentErrors+ -- collection of errors that occurred during a mass assignment using the
4498 +attributes=+ method. The +errors+ property of this exception contains an array of +AttributeAssignmentError+
4499 objects that should be inspected to determine which attributes triggered the errors.
4500 * +AttributeAssignmentError+ -- an error occurred while doing a mass assignment through the +attributes=+ method.
4501 You can inspect the +attribute+ property of the exception object to determine which attribute triggered the error.
4502
4503 * Fixed that postgresql adapter would fails when reading bytea fields with null value #771 [rodrigo k]
4504
4505 * Added transactional fixtures that uses rollback to undo changes to fixtures instead of DELETE/INSERT -- it's much faster. See documentation under Fixtures #760 [Jeremy Kemper]
4506
4507 * Added destruction of dependent objects in has_one associations when a new assignment happens #742 [mindel]. Example:
4508
4509 class Account < ActiveRecord::Base
4510 has_one :credit_card, :dependent => true
4511 end
4512 class CreditCard < ActiveRecord::Base
4513 belongs_to :account
4514 end
4515
4516 account.credit_card # => returns existing credit card, lets say id = 12
4517 account.credit_card = CreditCard.create("number" => "123")
4518 account.save # => CC with id = 12 is destroyed
4519
4520
4521 * Added validates_numericality_of #716 [Sebastian Kanthak/Chris McGrath]. Docuemntation:
4522
4523 Validates whether the value of the specified attribute is numeric by trying to convert it to
4524 a float with Kernel.Float (if <tt>integer</tt> is false) or applying it to the regular expression
4525 <tt>/^[\+\-]?\d+$/</tt> (if <tt>integer</tt> is set to true).
4526
4527 class Person < ActiveRecord::Base
4528 validates_numericality_of :value, :on => :create
4529 end
4530
4531 Configuration options:
4532 * <tt>message</tt> - A custom error message (default is: "is not a number")
4533 * <tt>on</tt> Specifies when this validation is active (default is :save, other options :create, :update)
4534 * <tt>only_integer</tt> Specifies whether the value has to be an integer, e.g. an integral value (default is false)
4535
4536
4537 * Fixed that HasManyAssociation#count was using :finder_sql rather than :counter_sql if it was available #445 [Scott Barron]
4538
4539 * Added better defaults for composed_of, so statements like composed_of :time_zone, :mapping => %w( time_zone time_zone ) can be written without the mapping part (it's now assumed)
4540
4541 * Added MacroReflection#macro which will return a symbol describing the macro used (like :composed_of or :has_many) #718, #248 [james@slashetc.com]
4542
4543
4544 *1.7.0* (24th February, 2005)
4545
4546 * Changed the auto-timestamping feature to use ActiveRecord::Base.default_timezone instead of entertaining the parallel ActiveRecord::Base.timestamps_gmt method. The latter is now deprecated and will throw a warning on use (but still work) #710 [Jamis Buck]
4547
4548 * Added a OCI8-based Oracle adapter that has been verified to work with Oracle 8 and 9 #629 [Graham Jenkins]. Usage notes:
4549
4550 1. Key generation uses a sequence "rails_sequence" for all tables. (I couldn't find a simple
4551 and safe way of passing table-specific sequence information to the adapter.)
4552 2. Oracle uses DATE or TIMESTAMP datatypes for both dates and times. Consequently I have had to
4553 resort to some hacks to get data converted to Date or Time in Ruby.
4554 If the column_name ends in _at (like created_at, updated_at) it's created as a Ruby Time. Else if the
4555 hours/minutes/seconds are 0, I make it a Ruby Date. Else it's a Ruby Time.
4556 This is nasty - but if you use Duck Typing you'll probably not care very much.
4557 In 9i it's tempting to map DATE to Date and TIMESTAMP to Time but I don't think that is
4558 valid - too many databases use DATE for both.
4559 Timezones and sub-second precision on timestamps are not supported.
4560 3. Default values that are functions (such as "SYSDATE") are not supported. This is a
4561 restriction of the way active record supports default values.
4562 4. Referential integrity constraints are not fully supported. Under at least
4563 some circumstances, active record appears to delete parent and child records out of
4564 sequence and out of transaction scope. (Or this may just be a problem of test setup.)
4565
4566 The OCI8 driver can be retrieved from http://rubyforge.org/projects/ruby-oci8/
4567
4568 * Added option :schema_order to the PostgreSQL adapter to support the use of multiple schemas per database #697 [YuriSchimke]
4569
4570 * Optimized the SQL used to generate has_and_belongs_to_many queries by listing the join table first #693 [yerejm]
4571
4572 * Fixed that when using validation macros with a custom message, if you happened to use single quotes in the message string you would get a parsing error #657 [tonka]
4573
4574 * Fixed that Active Record would throw Broken Pipe errors with FCGI when the MySQL connection timed out instead of reconnecting #428 [Nicholas Seckar]
4575
4576 * Added options to specify an SSL connection for MySQL. Define the following attributes in the connection config (config/database.yml in Rails) to use it: sslkey, sslcert, sslca, sslcapath, sslcipher. To use SSL with no client certs, just set :sslca = '/dev/null'. http://dev.mysql.com/doc/mysql/en/secure-connections.html #604 [daniel@nightrunner.com]
4577
4578 * Added automatic dropping/creating of test tables for running the unit tests on all databases #587 [adelle@bullet.net.au]
4579
4580 * Fixed that find_by_* would fail when column names had numbers #670 [demetrius]
4581
4582 * Fixed the SQL Server adapter on a bunch of issues #667 [DeLynn]
4583
4584 1. Created a new columns method that is much cleaner.
4585 2. Corrected a problem with the select and select_all methods
4586 that didn't account for the LIMIT clause being passed into raw SQL statements.
4587 3. Implemented the string_to_time method in order to create proper instances of the time class.
4588 4. Added logic to the simplified_type method that allows the database to specify the scale of float data.
4589 5. Adjusted the quote_column_name to account for the fact that MS SQL is bothered by a forward slash in the data string.
4590
4591 * Fixed that the dynamic finder like find_all_by_something_boolean(false) didn't work #649 [lmarlow]
4592
4593 * Added validates_each that validates each specified attribute against a block #610 [Jeremy Kemper]. Example:
4594
4595 class Person < ActiveRecord::Base
4596 validates_each :first_name, :last_name do |record, attr|
4597 record.errors.add attr, 'starts with z.' if attr[0] == ?z
4598 end
4599 end
4600
4601 * Added :allow_nil as an explicit option for validates_length_of, so unless that's set to true having the attribute as nil will also return an error if a range is specified as :within #610 [Jeremy Kemper]
4602
4603 * Added that validates_* now accept blocks to perform validations #618 [Tim Bates]. Example:
4604
4605 class Person < ActiveRecord::Base
4606 validate { |person| person.errors.add("title", "will never be valid") if SHOULD_NEVER_BE_VALID }
4607 end
4608
4609 * Addded validation for validate all the associated objects before declaring failure with validates_associated #618 [Tim Bates]
4610
4611 * Added keyword-style approach to defining the custom relational bindings #545 [Jamis Buck]. Example:
4612
4613 class Project < ActiveRecord::Base
4614 primary_key "sysid"
4615 table_name "XYZ_PROJECT"
4616 inheritance_column { original_inheritance_column + "_id" }
4617 end
4618
4619 * Fixed Base#clone for use with PostgreSQL #565 [hanson@surgery.wisc.edu]
4620
4621
4622 *1.6.0* (January 25th, 2005)
4623
4624 * Added that has_many association build and create methods can take arrays of record data like Base#create and Base#build to build/create multiple records at once.
4625
4626 * Added that Base#delete and Base#destroy both can take an array of ids to delete/destroy #336
4627
4628 * Added the option of supplying an array of attributes to Base#create, so that multiple records can be created at once.
4629
4630 * Added the option of supplying an array of ids and attributes to Base#update, so that multiple records can be updated at once (inspired by #526/Duane Johnson). Example
4631
4632 people = { 1 => { "first_name" => "David" }, 2 => { "first_name" => "Jeremy"} }
4633 Person.update(people.keys, people.values)
4634
4635 * Added ActiveRecord::Base.timestamps_gmt that can be set to true to make the automated timestamping use GMT instead of local time #520 [Scott Baron]
4636
4637 * Added that update_all calls sanitize_sql on its updates argument, so stuff like MyRecord.update_all(['time = ?', Time.now]) works #519 [notahat]
4638
4639 * Fixed that the dynamic finders didn't treat nil as a "IS NULL" but rather "= NULL" case #515 [Demetrius]
4640
4641 * Added bind-named arrays for interpolating a group of ids or strings in conditions #528 [Jeremy Kemper]
4642
4643 * Added that has_and_belongs_to_many associations with additional attributes also can be created between unsaved objects and only committed to the database when Base#save is called on the associator #524 [Eric Anderson]
4644
4645 * Fixed that records fetched with piggy-back attributes or through rich has_and_belongs_to_many associations couldn't be saved due to the extra attributes not part of the table #522 [Eric Anderson]
4646
4647 * Added mass-assignment protection for the inheritance column -- regardless of a custom column is used or not
4648
4649 * Fixed that association proxies would fail === tests like PremiumSubscription === @account.subscription
4650
4651 * Fixed that column aliases didn't work as expected with the new MySql411 driver #507 [Demetrius]
4652
4653 * Fixed that find_all would produce invalid sql when called sequentialy #490 [Scott Baron]
4654
4655
4656 *1.5.1* (January 18th, 2005)
4657
4658 * Fixed that the belongs_to and has_one proxy would fail a test like 'if project.manager' -- this unfortunately also means that you can't call methods like project.manager.build unless there already is a manager on the project #492 [Tim Bates]
4659
4660 * Fixed that the Ruby/MySQL adapter wouldn't connect if the password was empty #503 [Pelle]
4661
4662
4663 *1.5.0* (January 17th, 2005)
4664
4665 * Fixed that unit tests for MySQL are now run as the "rails" user instead of root #455 [Eric Hodel]
4666
4667 * Added validates_associated that enables validation of objects in an unsaved association #398 [Tim Bates]. Example:
4668
4669 class Book < ActiveRecord::Base
4670 has_many :pages
4671 belongs_to :library
4672
4673 validates_associated :pages, :library
4674 end
4675
4676 * Added support for associating unsaved objects #402 [Tim Bates]. Rules that govern this addition:
4677
4678 == Unsaved objects and associations
4679
4680 You can manipulate objects and associations before they are saved to the database, but there is some special behaviour you should be
4681 aware of, mostly involving the saving of associated objects.
4682
4683 === One-to-one associations
4684
4685 * Assigning an object to a has_one association automatically saves that object, and the object being replaced (if there is one), in
4686 order to update their primary keys - except if the parent object is unsaved (new_record? == true).
4687 * If either of these saves fail (due to one of the objects being invalid) the assignment statement returns false and the assignment
4688 is cancelled.
4689 * If you wish to assign an object to a has_one association without saving it, use the #association.build method (documented below).
4690 * Assigning an object to a belongs_to association does not save the object, since the foreign key field belongs on the parent. It does
4691 not save the parent either.
4692
4693 === Collections
4694
4695 * Adding an object to a collection (has_many or has_and_belongs_to_many) automatically saves that object, except if the parent object
4696 (the owner of the collection) is not yet stored in the database.
4697 * If saving any of the objects being added to a collection (via #push or similar) fails, then #push returns false.
4698 * You can add an object to a collection without automatically saving it by using the #collection.build method (documented below).
4699 * All unsaved (new_record? == true) members of the collection are automatically saved when the parent is saved.
4700
4701 * Added replace to associations, so you can do project.manager.replace(new_manager) or project.milestones.replace(new_milestones) #402 [Tim Bates]
4702
4703 * Added build and create methods to has_one and belongs_to associations, so you can now do project.manager.build(attributes) #402 [Tim Bates]
4704
4705 * Added that if a before_* callback returns false, all the later callbacks and the associated action are cancelled. If an after_* callback returns false, all the later callbacks are cancelled. Callbacks are generally run in the order they are defined, with the exception of callbacks defined as methods on the model, which are called last. #402 [Tim Bates]
4706
4707 * Fixed that Base#== wouldn't work for multiple references to the same unsaved object #402 [Tim Bates]
4708
4709 * Fixed binary support for PostgreSQL #444 [alex@byzantine.no]
4710
4711 * Added a differenciation between AssociationCollection#size and -length. Now AssociationCollection#size returns the size of the
4712 collection by executing a SELECT COUNT(*) query if the collection hasn't been loaded and calling collection.size if it has. If
4713 it's more likely than not that the collection does have a size larger than zero and you need to fetch that collection afterwards,
4714 it'll take one less SELECT query if you use length.
4715
4716 * Added Base#attributes that returns a hash of all the attributes with their names as keys and clones of their objects as values #433 [atyp.de]
4717
4718 * Fixed that foreign keys named the same as the association would cause stack overflow #437 [Eric Anderson]
4719
4720 * Fixed default scope of acts_as_list from "1" to "1 = 1", so it'll work in PostgreSQL (among other places) #427 [Alexey]
4721
4722 * Added Base#reload that reloads the attributes of an object from the database #422 [Andreas Schwarz]
4723
4724 * Added SQLite3 compatibility through the sqlite3-ruby adapter by Jamis Buck #381 [Jeremy Kemper]
4725
4726 * Added support for the new protocol spoken by MySQL 4.1.1+ servers for the Ruby/MySQL adapter that ships with Rails #440 [Matt Mower]
4727
4728 * Added that Observers can use the observes class method instead of overwriting self.observed_class().
4729
4730 Before:
4731 class ListSweeper < ActiveRecord::Base
4732 def self.observed_class() [ List, Item ]
4733 end
4734
4735 After:
4736 class ListSweeper < ActiveRecord::Base
4737 observes List, Item
4738 end
4739
4740 * Fixed that conditions in has_many and has_and_belongs_to_many should be interpolated just like the finder_sql is
4741
4742 * Fixed Base#update_attribute to be indifferent to whether a string or symbol is used to describe the name
4743
4744 * Added Base#toggle(attribute) and Base#toggle!(attribute) that makes it easier to flip a switch or flag.
4745
4746 Before: topic.update_attribute(:approved, !approved?)
4747 After : topic.toggle!(:approved)
4748
4749 * Added Base#increment!(attribute) and Base#decrement!(attribute) that also saves the records. Example:
4750
4751 page.views # => 1
4752 page.increment!(:views) # executes an UPDATE statement
4753 page.views # => 2
4754
4755 page.increment(:views).increment!(:views)
4756 page.views # => 4
4757
4758 * Added Base#increment(attribute) and Base#decrement(attribute) that encapsulates the += 1 and -= 1 patterns.
4759
4760
4761 *1.4.0* (January 4th, 2005)
4762
4763 * Added automated optimistic locking if the field <tt>lock_version</tt> is present. Each update to the
4764 record increments the lock_version column and the locking facilities ensure that records instantiated twice
4765 will let the last one saved raise a StaleObjectError if the first was also updated. Example:
4766
4767 p1 = Person.find(1)
4768 p2 = Person.find(1)
4769
4770 p1.first_name = "Michael"
4771 p1.save
4772
4773 p2.first_name = "should fail"
4774 p2.save # Raises a ActiveRecord::StaleObjectError
4775
4776 You're then responsible for dealing with the conflict by rescuing the exception and either rolling back, merging,
4777 or otherwise apply the business logic needed to resolve the conflict.
4778
4779 #384 [Michael Koziarski]
4780
4781 * Added dynamic attribute-based finders as a cleaner way of getting objects by simple queries without turning to SQL.
4782 They work by appending the name of an attribute to <tt>find_by_</tt>, so you get finders like <tt>Person.find_by_user_name,
4783 Payment.find_by_transaction_id</tt>. So instead of writing <tt>Person.find_first(["user_name = ?", user_name])</tt>, you just do
4784 <tt>Person.find_by_user_name(user_name)</tt>.
4785
4786 It's also possible to use multiple attributes in the same find by separating them with "_and_", so you get finders like
4787 <tt>Person.find_by_user_name_and_password</tt> or even <tt>Payment.find_by_purchaser_and_state_and_country</tt>. So instead of writing
4788 <tt>Person.find_first(["user_name = ? AND password = ?", user_name, password])</tt>, you just do
4789 <tt>Person.find_by_user_name_and_password(user_name, password)</tt>.
4790
4791 While primarily a construct for easier find_firsts, it can also be used as a construct for find_all by using calls like
4792 <tt>Payment.find_all_by_amount(50)</tt> that is turned into <tt>Payment.find_all(["amount = ?", 50])</tt>. This is something not as equally useful,
4793 though, as it's not possible to specify the order in which the objects are returned.
4794
4795 * Added block-style for callbacks #332 [Jeremy Kemper].
4796
4797 Before:
4798 before_destroy(Proc.new{ |record| Person.destroy_all "firm_id = #{record.id}" })
4799
4800 After:
4801 before_destroy { |record| Person.destroy_all "firm_id = #{record.id}" }
4802
4803 * Added :counter_cache option to acts_as_tree that works just like the one you can define on belongs_to #371 [Josh Peek]
4804
4805 * Added Base.default_timezone accessor that determines whether to use Time.local (using :local) or Time.utc (using :utc) when pulling dates
4806 and times from the database. This is set to :local by default.
4807
4808 * Added the possibility for adapters to overwrite add_limit! to implement a different limiting scheme than "LIMIT X" used by MySQL, PostgreSQL, and SQLite.
4809
4810 * Added the possibility of having objects with acts_as_list created before their scope is available or...
4811
4812 * Added a db2 adapter that only depends on the Ruby/DB2 bindings (http://raa.ruby-lang.org/project/ruby-db2/) #386 [Maik Schmidt]
4813
4814 * Added the final touches to the Microsoft SQL Server adapter by Joey Gibson that makes it suitable for actual use #394 [DeLynn Barry]
4815
4816 * Added that Base#find takes an optional options hash, including :conditions. Base#find_on_conditions deprecated in favor of #find with :conditions #407 [Jeremy Kemper]
4817
4818 * Added HasManyAssociation#count that works like Base#count #413 [intinig]
4819
4820 * Fixed handling of binary content in blobs and similar fields for Ruby/MySQL and SQLite #409 [xal]
4821
4822 * Fixed a bug in the Ruby/MySQL that caused binary content to be escaped badly and come back mangled #405 [Tobias Lütke]
4823
4824 * Fixed that the const_missing autoload assumes the requested constant is set by require_association and calls const_get to retrieve it.
4825 If require_association did not set the constant then const_get will call const_missing, resulting in an infinite loop #380 [Jeremy Kemper]
4826
4827 * Fixed broken transactions that were actually only running object-level and not db level transactions [andreas]
4828
4829 * Fixed that validates_uniqueness_of used 'id' instead of defined primary key #406
4830
4831 * Fixed that the overwritten respond_to? method didn't take two parameters like the original #391
4832
4833 * Fixed quoting in validates_format_of that would allow some rules to pass regardless of input #390 [Dmitry V. Sabanin]
4834
4835
4836 *1.3.0* (December 23, 2004)
4837
4838 * Added a require_association hook on const_missing that makes it possible to use any model class without requiring it first. This makes STI look like:
4839
4840 before:
4841 require_association 'person'
4842 class Employee < Person
4843 end
4844
4845 after:
4846 class Employee < Person
4847 end
4848
4849 This also reduces the usefulness of Controller.model in Action Pack to currently only being for documentation purposes.
4850
4851 * Added that Base.update_all and Base.delete_all return an integer of the number of affected rows #341
4852
4853 * Added scope option to validation_uniqueness #349 [Kent Sibilev]
4854
4855 * Added respondence to *_before_type_cast for all attributes to return their string-state before they were type casted by the column type.
4856 This is helpful for getting "100,000" back on a integer-based validation where the value would normally be "100".
4857
4858 * Added allow_nil options to validates_inclusion_of so that validation is only triggered if the attribute is not nil [what-a-day]
4859
4860 * Added work-around for PostgreSQL and the problem of getting fixtures to be created from id 1 on each test case.
4861 This only works for auto-incrementing primary keys called "id" for now #359 [Scott Baron]
4862
4863 * Added Base#clear_association_cache to empty all the cached associations #347 [Tobias Lütke]
4864
4865 * Added more informative exceptions in establish_connection #356 [Jeremy Kemper]
4866
4867 * Added Base#update_attributes that'll accept a hash of attributes and save the record (returning true if it passed validation, false otherwise).
4868
4869 Before:
4870 person.attributes = @params["person"]
4871 person.save
4872
4873 Now:
4874 person.update_attributes(@params["person"])
4875
4876 * Added Base.destroy and Base.delete to remove records without holding a reference to them first.
4877
4878 * Added that query benchmarking will only happen if its going to be logged anyway #344
4879
4880 * Added higher_item and lower_item as public methods for acts_as_list #342 [Tobias Lütke]
4881
4882 * Fixed that options[:counter_sql] was overwritten with interpolated sql rather than original sql #355 [Jeremy Kemper]
4883
4884 * Fixed that overriding an attribute's accessor would be disregarded by add_on_empty and add_on_boundary_breaking because they simply used
4885 the attributes[] hash instead of checking for @base.respond_to?(attr.to_s). [Marten]
4886
4887 * Fixed that Base.table_name would expect a parameter when used in has_and_belongs_to_many joins [Anna Lissa Cruz]
4888
4889 * Fixed that nested transactions now work by letting the outer most transaction have the responsibilty of starting and rolling back the transaction.
4890 If any of the inner transactions swallow the exception raised, though, the transaction will not be rolled back. So always let the transaction
4891 bubble up even when you've dealt with local issues. Closes #231 and #340.
4892
4893 * Fixed validates_{confirmation,acceptance}_of to only happen when the virtual attributes are not nil #348 [dpiddy@gmail.com]
4894
4895 * Changed the interface on AbstractAdapter to require that adapters return the number of affected rows on delete and update operations.
4896
4897 * Fixed the automated timestamping feature when running under Rails' development environment that resets the inheritable attributes on each request.
4898
4899
4900
4901 *1.2.0*
4902
4903 * Added Base.validates_inclusion_of that validates whether the value of the specified attribute is available in a particular enumerable
4904 object. [what-a-day]
4905
4906 class Person < ActiveRecord::Base
4907 validates_inclusion_of :gender, :in=>%w( m f ), :message=>"woah! what are you then!??!!"
4908 validates_inclusion_of :age, :in=>0..99
4909 end
4910
4911 * Added acts_as_list that can decorates an existing class with methods like move_higher/lower, move_to_top/bottom. [Tobias Lütke] Example:
4912
4913 class TodoItem < ActiveRecord::Base
4914 acts_as_list :scope => :todo_list_id
4915 belongs_to :todo_list
4916 end
4917
4918 * Added acts_as_tree that can decorates an existing class with a many to many relationship with itself. Perfect for categories in
4919 categories and the likes. [Tobias Lütke]
4920
4921 * Added that Active Records will automatically record creation and/or update timestamps of database objects if fields of the names
4922 created_at/created_on or updated_at/updated_on are present. [Tobias Lütke]
4923
4924 * Added Base.default_error_messages as a hash of all the error messages used in the validates_*_of so they can be changed in one place [Tobias Lütke]
4925
4926 * Added automatic transaction block around AssociationCollection.<<, AssociationCollection.delete, and AssociationCollection.destroy_all
4927
4928 * Fixed that Base#find will return an array if given an array -- regardless of the number of elements #270 [Marten]
4929
4930 * Fixed that has_and_belongs_to_many would generate bad sql when naming conventions differed from using vanilla "id" everywhere [RedTerror]
4931
4932 * Added a better exception for when a type column is used in a table without the intention of triggering single-table inheritance. Example:
4933
4934 ActiveRecord::SubclassNotFound: The single-table inheritance mechanism failed to locate the subclass: 'bad_class!'.
4935 This error is raised because the column 'type' is reserved for storing the class in case of inheritance.
4936 Please rename this column if you didn't intend it to be used for storing the inheritance class or
4937 overwrite Company.inheritance_column to use another column for that information.
4938
4939 * Added that single-table inheritance will only kick in if the inheritance_column (by default "type") is present. Otherwise, inheritance won't
4940 have any magic side effects.
4941
4942 * Added the possibility of marking fields as being in error without adding a message (using nil) to it that'll get displayed wth full_messages #208 [mjobin]
4943
4944 * Fixed Base.errors to be indifferent as to whether strings or symbols are used. Examples:
4945
4946 Before:
4947 errors.add(:name, "must be shorter") if name.size > 10
4948 errors.on(:name) # => "must be shorter"
4949 errors.on("name") # => nil
4950
4951 After:
4952 errors.add(:name, "must be shorter") if name.size > 10
4953 errors.on(:name) # => "must be shorter"
4954 errors.on("name") # => "must be shorter"
4955
4956 * Added Base.validates_format_of that Validates whether the value of the specified attribute is of the correct form by matching
4957 it against the regular expression provided. [Marcel Molina Jr.]
4958
4959 class Person < ActiveRecord::Base
4960 validates_format_of :email, :with => /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/, :on => :create
4961 end
4962
4963 * Added Base.validates_length_of that delegates to add_on_boundary_breaking #312 [Tobias Lütke]. Example:
4964
4965 Validates that the specified attribute matches the length restrictions supplied in either:
4966
4967 - configuration[:minimum]
4968 - configuration[:maximum]
4969 - configuration[:is]
4970 - configuration[:within] (aka. configuration[:in])
4971
4972 Only one option can be used at a time.
4973
4974 class Person < ActiveRecord::Base
4975 validates_length_of :first_name, :maximum=>30
4976 validates_length_of :last_name, :maximum=>30, :message=>"less than %d if you don't mind"
4977 validates_length_of :user_name, :within => 6..20, :too_long => "pick a shorter name", :too_short => "pick a longer name"
4978 validates_length_of :fav_bra_size, :minimum=>1, :too_short=>"please enter at least %d character"
4979 validates_length_of :smurf_leader, :is=>4, :message=>"papa is spelled with %d characters... don't play me."
4980 end
4981
4982 * Added Base.validate_presence as an alternative to implementing validate and doing errors.add_on_empty yourself.
4983
4984 * Added Base.validates_uniqueness_of that alidates whether the value of the specified attributes are unique across the system.
4985 Useful for making sure that only one user can be named "davidhh".
4986
4987 class Person < ActiveRecord::Base
4988 validates_uniqueness_of :user_name
4989 end
4990
4991 When the record is created, a check is performed to make sure that no record exist in the database with the given value for the specified
4992 attribute (that maps to a column). When the record is updated, the same check is made but disregarding the record itself.
4993
4994
4995 * Added Base.validates_confirmation_of that encapsulates the pattern of wanting to validate a password or email address field with a confirmation. Example:
4996
4997 Model:
4998 class Person < ActiveRecord::Base
4999 validates_confirmation_of :password
5000 end
5001
5002 View:
5003 <%= password_field "person", "password" %>
5004 <%= password_field "person", "password_confirmation" %>
5005
5006 The person has to already have a password attribute (a column in the people table), but the password_confirmation is virtual.
5007 It exists only as an in-memory variable for validating the password. This check is performed both on create and update.
5008
5009
5010 * Added Base.validates_acceptance_of that encapsulates the pattern of wanting to validate the acceptance of a terms of service check box (or similar agreement). Example:
5011
5012 class Person < ActiveRecord::Base
5013 validates_acceptance_of :terms_of_service
5014 end
5015
5016 The terms_of_service attribute is entirely virtual. No database column is needed. This check is performed both on create and update.
5017
5018 NOTE: The agreement is considered valid if it's set to the string "1". This makes it easy to relate it to an HTML checkbox.
5019
5020
5021 * Added validation macros to make the stackable just like the lifecycle callbacks. Examples:
5022
5023 class Person < ActiveRecord::Base
5024 validate { |record| record.errors.add("name", "too short") unless name.size > 10 }
5025 validate { |record| record.errors.add("name", "too long") unless name.size < 20 }
5026 validate_on_create :validate_password
5027
5028 private
5029 def validate_password
5030 errors.add("password", "too short") unless password.size > 6
5031 end
5032 end
5033
5034 * Added the option for sanitizing find_by_sql and the offset parts in regular finds [Sam Stephenson]. Examples:
5035
5036 Project.find_all ["category = ?", category_name], "created ASC", ["? OFFSET ?", 15, 20]
5037 Post.find_by_sql ["SELECT * FROM posts WHERE author = ? AND created > ?", author_id, start_date]
5038
5039 * Fixed value quoting in all generated SQL statements, so that integers are not surrounded in quotes and that all sanitation are happening
5040 through the database's own quoting routine. This should hopefully make it lots easier for new adapters that doesn't accept '1' for integer
5041 columns.
5042
5043 * Fixed has_and_belongs_to_many guessing of foreign key so that keys are generated correctly for models like SomeVerySpecialClient
5044 [Florian Weber]
5045
5046 * Added counter_sql option for has_many associations [Jeremy Kemper]. Documentation:
5047
5048 <tt>:counter_sql</tt> - specify a complete SQL statement to fetch the size of the association. If +:finder_sql+ is
5049 specified but +:counter_sql+, +:counter_sql+ will be generated by replacing SELECT ... FROM with SELECT COUNT(*) FROM.
5050
5051 * Fixed that methods wrapped in callbacks still return their original result #260 [Jeremy Kemper]
5052
5053 * Fixed the Inflector to handle the movie/movies pair correctly #261 [Scott Baron]
5054
5055 * Added named bind-style variable interpolation #281 [Michael Koziarski]. Example:
5056
5057 Person.find(["id = :id and first_name = :first_name", { :id => 5, :first_name = "bob' or 1=1" }])
5058
5059 * Added bind-style variable interpolation for the condition arrays that uses the adapter's quote method [Michael Koziarski]
5060
5061 Before:
5062 find_first([ "user_name = '%s' AND password = '%s'", user_name, password ])]
5063 find_first([ "firm_id = %s", firm_id ])] # unsafe!
5064
5065 After:
5066 find_first([ "user_name = ? AND password = ?", user_name, password ])]
5067 find_first([ "firm_id = ?", firm_id ])]
5068
5069 * Added CSV format for fixtures #272 [what-a-day]. (See the new and expanded documentation on fixtures for more information)
5070
5071 * Fixed fixtures using primary key fields called something else than "id" [dave]
5072
5073 * Added proper handling of time fields that are turned into Time objects with the dummy date of 2000/1/1 [HariSeldon]
5074
5075 * Added reverse order of deleting fixtures, so referential keys can be maintained #247 [Tim Bates]
5076
5077 * Added relative path search for sqlite dbfiles in database.yml (if RAILS_ROOT is defined) #233 [Jeremy Kemper]
5078
5079 * Added option to establish_connection where you'll be able to leave out the parameter to have it use the RAILS_ENV environment variable
5080
5081 * Fixed problems with primary keys and postgresql sequences (#230) [Tim Bates]
5082
5083 * Added reloading for associations under cached environments like FastCGI and mod_ruby. This makes it possible to use those environments for development.
5084 This is turned on by default, but can be turned off with ActiveRecord::Base.reload_dependencies = false in production environments.
5085
5086 NOTE: This will only have an effect if you let the associations manage the requiring of model classes. All libraries loaded through
5087 require will be "forever" cached. You can, however, use ActiveRecord::Base.load_or_require("library") to get this behavior outside of the
5088 auto-loading associations.
5089
5090 * Added ERB capabilities to the fixture files for dynamic fixture generation. You don't need to do anything, just include ERB blocks like:
5091
5092 david:
5093 id: 1
5094 name: David
5095
5096 jamis:
5097 id: 2
5098 name: Jamis
5099
5100 <% for digit in 3..10 %>
5101 dev_<%= digit %>:
5102 id: <%= digit %>
5103 name: fixture_<%= digit %>
5104 <% end %>
5105
5106 * Changed the yaml fixture searcher to look in the root of the fixtures directory, so when you before could have something like:
5107
5108 fixtures/developers/fixtures.yaml
5109 fixtures/accounts/fixtures.yaml
5110
5111 ...you now need to do:
5112
5113 fixtures/developers.yaml
5114 fixtures/accounts.yaml
5115
5116 * Changed the fixture format from:
5117
5118 name: david
5119 data:
5120 id: 1
5121 name: David Heinemeier Hansson
5122 birthday: 1979-10-15
5123 profession: Systems development
5124 ---
5125 name: steve
5126 data:
5127 id: 2
5128 name: Steve Ross Kellock
5129 birthday: 1974-09-27
5130 profession: guy with keyboard
5131
5132 ...to:
5133
5134 david:
5135 id: 1
5136 name: David Heinemeier Hansson
5137 birthday: 1979-10-15
5138 profession: Systems development
5139
5140 steve:
5141 id: 2
5142 name: Steve Ross Kellock
5143 birthday: 1974-09-27
5144 profession: guy with keyboard
5145
5146 The change is NOT backwards compatible. Fixtures written in the old YAML style needs to be rewritten!
5147
5148 * All associations will now attempt to require the classes that they associate to. Relieving the need for most explicit 'require' statements.
5149
5150
5151 *1.1.0* (34)
5152
5153 * Added automatic fixture setup and instance variable availability. Fixtures can also be automatically
5154 instantiated in instance variables relating to their names using the following style:
5155
5156 class FixturesTest < Test::Unit::TestCase
5157 fixtures :developers # you can add more with comma separation
5158
5159 def test_developers
5160 assert_equal 3, @developers.size # the container for all the fixtures is automatically set
5161 assert_kind_of Developer, @david # works like @developers["david"].find
5162 assert_equal "David Heinemeier Hansson", @david.name
5163 end
5164 end
5165
5166 * Added HasAndBelongsToManyAssociation#push_with_attributes(object, join_attributes) that can create associations in the join table with additional
5167 attributes. This is really useful when you have information that's only relevant to the join itself, such as a "added_on" column for an association
5168 between post and category. The added attributes will automatically be injected into objects retrieved through the association similar to the piggy-back
5169 approach:
5170
5171 post.categories.push_with_attributes(category, :added_on => Date.today)
5172 post.categories.first.added_on # => Date.today
5173
5174 NOTE: The categories table doesn't have a added_on column, it's the categories_post join table that does!
5175
5176 * Fixed that :exclusively_dependent and :dependent can't be activated at the same time on has_many associations [Jeremy Kemper]
5177
5178 * Fixed that database passwords couldn't be all numeric [Jeremy Kemper]
5179
5180 * Fixed that calling id would create the instance variable for new_records preventing them from being saved correctly [Jeremy Kemper]
5181
5182 * Added sanitization feature to HasManyAssociation#find_all so it works just like Base.find_all [Sam Stephenson/Jeremy Kemper]
5183
5184 * Added that you can pass overlapping ids to find without getting duplicated records back [Jeremy Kemper]
5185
5186 * Added that Base.benchmark returns the result of the block [Jeremy Kemper]
5187
5188 * Fixed problem with unit tests on Windows with SQLite [paterno]
5189
5190 * Fixed that quotes would break regular non-yaml fixtures [Dmitry Sabanin/daft]
5191
5192 * Fixed fixtures on windows with line endings cause problems under unix / mac [Tobias Lütke]
5193
5194 * Added HasAndBelongsToManyAssociation#find(id) that'll search inside the collection and find the object or record with that id
5195
5196 * Added :conditions option to has_and_belongs_to_many that works just like the one on all the other associations
5197
5198 * Added AssociationCollection#clear to remove all associations from has_many and has_and_belongs_to_many associations without destroying the records [geech]
5199
5200 * Added type-checking and remove in 1-instead-of-N sql statements to AssociationCollection#delete [geech]
5201
5202 * Added a return of self to AssociationCollection#<< so appending can be chained, like project << Milestone.create << Milestone.create [geech]
5203
5204 * Added Base#hash and Base#eql? which means that all of the equality using features of array and other containers now works:
5205
5206 [ Person.find(1), Person.find(2), Person.find(3) ] & [ Person.find(1), Person.find(4) ] # => [ Person.find(1) ]
5207
5208 * Added :uniq as an option to has_and_belongs_to_many which will automatically ensure that AssociateCollection#uniq is called
5209 before pulling records out of the association. This is especially useful for three-way (and above) has_and_belongs_to_many associations.
5210
5211 * Added AssociateCollection#uniq which is especially useful for has_and_belongs_to_many associations that can include duplicates,
5212 which is common on associations that also use metadata. Usage: post.categories.uniq
5213
5214 * Fixed respond_to? to use a subclass specific hash instead of an Active Record-wide one
5215
5216 * Fixed has_and_belongs_to_many to treat associations between classes in modules properly [Florian Weber]
5217
5218 * Added a NoMethod exception to be raised when query and writer methods are called for attributes that doesn't exist [geech]
5219
5220 * Added a more robust version of Fixtures that throws meaningful errors when on formatting issues [geech]
5221
5222 * Added Base#transaction as a compliment to Base.transaction for prettier use in instance methods [geech]
5223
5224 * Improved the speed of respond_to? by placing the dynamic methods lookup table in a hash [geech]
5225
5226 * Added that any additional fields added to the join table in a has_and_belongs_to_many association
5227 will be placed as attributes when pulling records out through has_and_belongs_to_many associations.
5228 This is helpful when have information about the association itself that you want available on retrival.
5229
5230 * Added better loading exception catching and RubyGems retries to the database adapters [alexeyv]
5231
5232 * Fixed bug with per-model transactions [daniel]
5233
5234 * Fixed Base#transaction so that it returns the result of the last expression in the transaction block [alexeyv]
5235
5236 * Added Fixture#find to find the record corresponding to the fixture id. The record
5237 class name is guessed by using Inflector#classify (also new) on the fixture directory name.
5238
5239 Before: Document.find(@documents["first"]["id"])
5240 After : @documents["first"].find
5241
5242 * Fixed that the table name part of column names ("TABLE.COLUMN") wasn't removed properly [Andreas Schwarz]
5243
5244 * Fixed a bug with Base#size when a finder_sql was used that didn't capitalize SELECT and FROM [geech]
5245
5246 * Fixed quoting problems on SQLite by adding quote_string to the AbstractAdapter that can be overwritten by the concrete
5247 adapters for a call to the dbm. [Andreas Schwarz]
5248
5249 * Removed RubyGems backup strategy for requiring SQLite-adapter -- if people want to use gems, they're already doing it with AR.
5250
5251
5252 *1.0.0 (35)*
5253
5254 * Added OO-style associations methods [Florian Weber]. Examples:
5255
5256 Project#milestones_count => Project#milestones.size
5257 Project#build_to_milestones => Project#milestones.build
5258 Project#create_for_milestones => Project#milestones.create
5259 Project#find_in_milestones => Project#milestones.find
5260 Project#find_all_in_milestones => Project#milestones.find_all
5261
5262 * Added serialize as a new class method to control when text attributes should be YAMLized or not. This means that automated
5263 serialization of hashes, arrays, and so on WILL NO LONGER HAPPEN (#10). You need to do something like this:
5264
5265 class User < ActiveRecord::Base
5266 serialize :settings
5267 end
5268
5269 This will assume that settings is a text column and will now YAMLize any object put in that attribute. You can also specify
5270 an optional :class_name option that'll raise an exception if a serialized object is retrieved as a descendant of a class not in
5271 the hierarchy. Example:
5272
5273 class User < ActiveRecord::Base
5274 serialize :settings, :class_name => "Hash"
5275 end
5276
5277 user = User.create("settings" => %w( one two three ))
5278 User.find(user.id).settings # => raises SerializationTypeMismatch
5279
5280 * Added the option to connect to a different database for one model at a time. Just call establish_connection on the class
5281 you want to have connected to another database than Base. This will automatically also connect decendents of that class
5282 to the different database [Renald Buter].
5283
5284 * Added transactional protection for Base#save. Validations can now check for values knowing that it happens in a transaction and callbacks
5285 can raise exceptions knowing that the save will be rolled back. [Suggested by Alexey Verkhovsky]
5286
5287 * Added column name quoting so reserved words, such as "references", can be used as column names [Ryan Platte]
5288
5289 * Added the possibility to chain the return of what happened inside a logged block [geech]:
5290
5291 This now works:
5292 log { ... }.map { ... }
5293
5294 Instead of doing:
5295 result = []
5296 log { result = ... }
5297 result.map { ... }
5298
5299 * Added "socket" option for the MySQL adapter, so you can change it to something else than "/tmp/mysql.sock" [Anna Lissa Cruz]
5300
5301 * Added respond_to? answers for all the attribute methods. So if Person has a name attribute retrieved from the table schema,
5302 person.respond_to? "name" will return true.
5303
5304 * Added Base.benchmark which can be used to aggregate logging and benchmark, so you can measure and represent multiple statements in a single block.
5305 Usage (hides all the SQL calls for the individual actions and calculates total runtime for them all):
5306
5307 Project.benchmark("Creating project") do
5308 project = Project.create("name" => "stuff")
5309 project.create_manager("name" => "David")
5310 project.milestones << Milestone.find_all
5311 end
5312
5313 * Added logging of invalid SQL statements [Daniel Von Fange]
5314
5315 * Added alias Errors#[] for Errors#on, so you can now say person.errors["name"] to retrieve the errors for name [Andreas Schwarz]
5316
5317 * Added RubyGems require attempt if sqlite-ruby is not available through regular methods.
5318
5319 * Added compatibility with 2.x series of sqlite-ruby drivers. [Jamis Buck]
5320
5321 * Added type safety for association assignments, so a ActiveRecord::AssociationTypeMismatch will be raised if you attempt to
5322 assign an object that's not of the associated class. This cures the problem with nil giving id = 4 and fixnums giving id = 1 on
5323 mistaken association assignments. [Reported by Andreas Schwarz]
5324
5325 * Added the option to keep many fixtures in one single YAML document [what-a-day]
5326
5327 * Added the class method "inheritance_column" that can be overwritten to return the name of an alternative column than "type" for storing
5328 the type for inheritance hierarchies. [Dave Steinberg]
5329
5330 * Added [] and []= as an alternative way to access attributes when the regular methods have been overwritten [Dave Steinberg]
5331
5332 * Added the option to observer more than one class at the time by specifying observed_class as an array
5333
5334 * Added auto-id propagation support for tables with arbitrary primary keys that have autogenerated sequences associated with them
5335 on PostgreSQL. [Dave Steinberg]
5336
5337 * Changed that integer and floats set to "" through attributes= remain as NULL. This was especially a problem for scaffolding and postgresql. (#49)
5338
5339 * Changed the MySQL Adapter to rely on MySQL for its defaults for socket, host, and port [Andreas Schwarz]
5340
5341 * Changed ActionControllerError to decent from StandardError instead of Exception. It can now be caught by a generic rescue.
5342
5343 * Changed class inheritable attributes to not use eval [Caio Chassot]
5344
5345 * Changed Errors#add to now use "invalid" as the default message instead of true, which means full_messages work with those [Marcel Molina Jr.]
5346
5347 * Fixed spelling on Base#add_on_boundry_breaking to Base#add_on_boundary_breaking (old naming still works) [Marcel Molina Jr.]
5348
5349 * Fixed that entries in the has_and_belongs_to_many join table didn't get removed when an associated object was destroyed.
5350
5351 * Fixed unnecessary calls to SET AUTOCOMMIT=0/1 for MySQL adapter [Andreas Schwarz]
5352
5353 * Fixed PostgreSQL defaults are now handled gracefully [Dave Steinberg]
5354
5355 * Fixed increment/decrement_counter are now atomic updates [Andreas Schwarz]
5356
5357 * Fixed the problems the Inflector had turning Attachment into attuchments and Cases into Casis [radsaq/Florian Gross]
5358
5359 * Fixed that cloned records would point attribute references on the parent object [Andreas Schwarz]
5360
5361 * Fixed SQL for type call on inheritance hierarchies [Caio Chassot]
5362
5363 * Fixed bug with typed inheritance [Florian Weber]
5364
5365 * Fixed a bug where has_many collection_count wouldn't use the conditions specified for that association
5366
5367
5368 *0.9.5*
5369
5370 * Expanded the table_name guessing rules immensely [Florian Green]. Documentation:
5371
5372 Guesses the table name (in forced lower-case) based on the name of the class in the inheritance hierarchy descending
5373 directly from ActiveRecord. So if the hierarchy looks like: Reply < Message < ActiveRecord, then Message is used
5374 to guess the table name from even when called on Reply. The guessing rules are as follows:
5375 * Class name ends in "x", "ch" or "ss": "es" is appended, so a Search class becomes a searches table.
5376 * Class name ends in "y" preceded by a consonant or "qu": The "y" is replaced with "ies",
5377 so a Category class becomes a categories table.
5378 * Class name ends in "fe": The "fe" is replaced with "ves", so a Wife class becomes a wives table.
5379 * Class name ends in "lf" or "rf": The "f" is replaced with "ves", so a Half class becomes a halves table.
5380 * Class name ends in "person": The "person" is replaced with "people", so a Salesperson class becomes a salespeople table.
5381 * Class name ends in "man": The "man" is replaced with "men", so a Spokesman class becomes a spokesmen table.
5382 * Class name ends in "sis": The "i" is replaced with an "e", so a Basis class becomes a bases table.
5383 * Class name ends in "tum" or "ium": The "um" is replaced with an "a", so a Datum class becomes a data table.
5384 * Class name ends in "child": The "child" is replaced with "children", so a NodeChild class becomes a node_children table.
5385 * Class name ends in an "s": No additional characters are added or removed.
5386 * Class name doesn't end in "s": An "s" is appended, so a Comment class becomes a comments table.
5387 * Class name with word compositions: Compositions are underscored, so CreditCard class becomes a credit_cards table.
5388 Additionally, the class-level table_name_prefix is prepended to the table_name and the table_name_suffix is appended.
5389 So if you have "myapp_" as a prefix, the table name guess for an Account class becomes "myapp_accounts".
5390
5391 You can also overwrite this class method to allow for unguessable links, such as a Mouse class with a link to a
5392 "mice" table. Example:
5393
5394 class Mouse < ActiveRecord::Base
5395 def self.table_name() "mice" end
5396 end
5397
5398 This conversion is now done through an external class called Inflector residing in lib/active_record/support/inflector.rb.
5399
5400 * Added find_all_in_collection to has_many defined collections. Works like this:
5401
5402 class Firm < ActiveRecord::Base
5403 has_many :clients
5404 end
5405
5406 firm.id # => 1
5407 firm.find_all_in_clients "revenue > 1000" # SELECT * FROM clients WHERE firm_id = 1 AND revenue > 1000
5408
5409 [Requested by Dave Thomas]
5410
5411 * Fixed finders for inheritance hierarchies deeper than one level [Florian Weber]
5412
5413 * Added add_on_boundry_breaking to errors to accompany add_on_empty as a default validation method. It's used like this:
5414
5415 class Person < ActiveRecord::Base
5416 protected
5417 def validation
5418 errors.add_on_boundry_breaking "password", 3..20
5419 end
5420 end
5421
5422 This will add an error to the tune of "is too short (minimum is 3 characters)" or "is too long (minimum is 20 characters)" if
5423 the password is outside the boundry. The messages can be changed by passing a third and forth parameter as message strings.
5424
5425 * Implemented a clone method that works properly with AR. It returns a clone of the record that
5426 hasn't been assigned an id yet and is treated as a new record.
5427
5428 * Allow for domain sockets in PostgreSQL by not assuming localhost when no host is specified [Scott Barron]
5429
5430 * Fixed that bignums are saved properly instead of attempted to be YAMLized [Andreas Schwartz]
5431
5432 * Fixed a bug in the GEM where the rdoc options weren't being passed according to spec [Chad Fowler]
5433
5434 * Fixed a bug with the exclusively_dependent option for has_many
5435
5436
5437 *0.9.4*
5438
5439 * Correctly guesses the primary key when the class is inside a module [Dave Steinberg].
5440
5441 * Added [] and []= as alternatives to read_attribute and write_attribute [Dave Steinberg]
5442
5443 * has_and_belongs_to_many now accepts an :order key to determine in which order the collection is returned [radsaq].
5444
5445 * The ids passed to find and find_on_conditions are now automatically sanitized.
5446
5447 * Added escaping of plings in YAML content.
5448
5449 * Multi-parameter assigns where all the parameters are empty will now be set to nil instead of a new instance of their class.
5450
5451 * Proper type within an inheritance hierarchy is now ensured already at object initialization (instead of first at create)
5452
5453
5454 *0.9.3*
5455
5456 * Fixed bug with using a different primary key name together with has_and_belongs_to_many [Investigation by Scott]
5457
5458 * Added :exclusively_dependent option to the has_many association macro. The doc reads:
5459
5460 If set to true all the associated object are deleted in one SQL statement without having their
5461 before_destroy callback run. This should only be used on associations that depend solely on
5462 this class and don't need to do any clean-up in before_destroy. The upside is that it's much
5463 faster, especially if there's a counter_cache involved.
5464
5465 * Added :port key to connection options, so the PostgreSQL and MySQL adapters can connect to a database server
5466 running on another port than the default.
5467
5468 * Converted the new natural singleton methods that prevented AR objects from being saved by PStore
5469 (and hence be placed in a Rails session) to a module. [Florian Weber]
5470
5471 * Fixed the use of floats (was broken since 0.9.0+)
5472
5473 * Fixed PostgreSQL adapter so default values are displayed properly when used in conjunction with
5474 Action Pack scaffolding.
5475
5476 * Fixed booleans support for PostgreSQL (use real true/false on boolean fields instead of 0/1 on tinyints) [radsaq]
5477
5478
5479 *0.9.2*
5480
5481 * Added static method for instantly updating a record
5482
5483 * Treat decimal and numeric as Ruby floats [Andreas Schwartz]
5484
5485 * Treat chars as Ruby strings (fixes problem for Action Pack form helpers too)
5486
5487 * Removed debugging output accidently left in (which would screw web applications)
5488
5489
5490 *0.9.1*
5491
5492 * Added MIT license
5493
5494 * Added natural object-style assignment for has_and_belongs_to_many associations. Consider the following model:
5495
5496 class Event < ActiveRecord::Base
5497 has_one_and_belongs_to_many :sponsors
5498 end
5499
5500 class Sponsor < ActiveRecord::Base
5501 has_one_and_belongs_to_many :sponsors
5502 end
5503
5504 Earlier, you'd have to use synthetic methods for creating associations between two objects of the above class:
5505
5506 roskilde_festival.add_to_sponsors(carlsberg)
5507 roskilde_festival.remove_from_sponsors(carlsberg)
5508
5509 nike.add_to_events(world_cup)
5510 nike.remove_from_events(world_cup)
5511
5512 Now you can use regular array-styled methods:
5513
5514 roskilde_festival.sponsors << carlsberg
5515 roskilde_festival.sponsors.delete(carlsberg)
5516
5517 nike.events << world_cup
5518 nike.events.delete(world_cup)
5519
5520 * Added delete method for has_many associations. Using this will nullify an association between the has_many and the belonging
5521 object by setting the foreign key to null. Consider this model:
5522
5523 class Post < ActiveRecord::Base
5524 has_many :comments
5525 end
5526
5527 class Comment < ActiveRecord::Base
5528 belongs_to :post
5529 end
5530
5531 You could do something like:
5532
5533 funny_comment.has_post? # => true
5534 announcement.comments.delete(funny_comment)
5535 funny_comment.has_post? # => false
5536
5537
5538 *0.9.0*
5539
5540 * Active Record is now thread safe! (So you can use it with Cerise and WEBrick applications)
5541 [Implementation idea by Michael Neumann, debugging assistance by Jamis Buck]
5542
5543 * Improved performance by roughly 400% on a basic test case of pulling 100 records and querying one attribute.
5544 This brings the tax for using Active Record instead of "riding on the metal" (using MySQL-ruby C-driver directly) down to ~50%.
5545 Done by doing lazy type conversions and caching column information on the class-level.
5546
5547 * Added callback objects and procs as options for implementing the target for callback macros.
5548
5549 * Added "counter_cache" option to belongs_to that automates the usage of increment_counter and decrement_counter. Consider:
5550
5551 class Post < ActiveRecord::Base
5552 has_many :comments
5553 end
5554
5555 class Comment < ActiveRecord::Base
5556 belongs_to :post
5557 end
5558
5559 Iterating over 100 posts like this:
5560
5561 <% for post in @posts %>
5562 <%= post.title %> has <%= post.comments_count %> comments
5563 <% end %>
5564
5565 Will generate 100 SQL count queries -- one for each call to post.comments_count. If you instead add a "comments_count" int column
5566 to the posts table and rewrite the comments association macro with:
5567
5568 class Comment < ActiveRecord::Base
5569 belongs_to :post, :counter_cache => true
5570 end
5571
5572 Those 100 SQL count queries will be reduced to zero. Beware that counter caching is only appropriate for objects that begin life
5573 with the object it's specified to belong with and is destroyed like that as well. Typically objects where you would also specify
5574 :dependent => true. If your objects switch from one belonging to another (like a post that can be move from one category to another),
5575 you'll have to manage the counter yourself.
5576
5577 * Added natural object-style assignment for has_one and belongs_to associations. Consider the following model:
5578
5579 class Project < ActiveRecord::Base
5580 has_one :manager
5581 end
5582
5583 class Manager < ActiveRecord::Base
5584 belongs_to :project
5585 end
5586
5587 Earlier, assignments would work like following regardless of which way the assignment told the best story:
5588
5589 active_record.manager_id = david.id
5590
5591 Now you can do it either from the belonging side:
5592
5593 david.project = active_record
5594
5595 ...or from the having side:
5596
5597 active_record.manager = david
5598
5599 If the assignment happens from the having side, the assigned object is automatically saved. So in the example above, the
5600 project_id attribute on david would be set to the id of active_record, then david would be saved.
5601
5602 * Added natural object-style assignment for has_many associations [Florian Weber]. Consider the following model:
5603
5604 class Project < ActiveRecord::Base
5605 has_many :milestones
5606 end
5607
5608 class Milestone < ActiveRecord::Base
5609 belongs_to :project
5610 end
5611
5612 Earlier, assignments would work like following regardless of which way the assignment told the best story:
5613
5614 deadline.project_id = active_record.id
5615
5616 Now you can do it either from the belonging side:
5617
5618 deadline.project = active_record
5619
5620 ...or from the having side:
5621
5622 active_record.milestones << deadline
5623
5624 The milestone is automatically saved with the new foreign key.
5625
5626 * API CHANGE: Attributes for text (or blob or similar) columns will now have unknown classes stored using YAML instead of using
5627 to_s. (Known classes that won't be yamelized are: String, NilClass, TrueClass, FalseClass, Fixnum, Date, and Time).
5628 Likewise, data pulled out of text-based attributes will be attempted converged using Yaml if they have the "--- " header.
5629 This was primarily done to be enable the storage of hashes and arrays without wrapping them in aggregations, so now you can do:
5630
5631 user = User.find(1)
5632 user.preferences = { "background" => "black", "display" => large }
5633 user.save
5634
5635 User.find(1).preferences # => { "background" => "black", "display" => large }
5636
5637 Please note that this method should only be used when you don't care about representing the object in proper columns in
5638 the database. A money object consisting of an amount and a currency is still a much better fit for a value object done through
5639 aggregations than this new option.
5640
5641 * POSSIBLE CODE BREAKAGE: As a consequence of the lazy type conversions, it's a bad idea to reference the @attributes hash
5642 directly (it always was, but now it's paramount that you don't). If you do, you won't get the type conversion. So to implement
5643 new accessors for existing attributes, use read_attribute(attr_name) and write_attribute(attr_name, value) instead. Like this:
5644
5645 class Song < ActiveRecord::Base
5646 # Uses an integer of seconds to hold the length of the song
5647
5648 def length=(minutes)
5649 write_attribute("length", minutes * 60)
5650 end
5651
5652 def length
5653 read_attribute("length") / 60
5654 end
5655 end
5656
5657 The clever kid will notice that this opens a door to sidestep the automated type conversion by using @attributes directly.
5658 This is not recommended as read/write_attribute may be granted additional responsibilities in the future, but if you think
5659 you know what you're doing and aren't afraid of future consequences, this is an option.
5660
5661 * Applied a few minor bug fixes reported by Daniel Von Fange.
5662
5663
5664 *0.8.4*
5665
5666 _Reflection_
5667
5668 * Added ActiveRecord::Reflection with a bunch of methods and classes for reflecting in aggregations and associations.
5669
5670 * Added Base.columns and Base.content_columns which returns arrays of column description (type, default, etc) objects.
5671
5672 * Added Base#attribute_names which returns an array of names for the attributes available on the object.
5673
5674 * Added Base#column_for_attribute(name) which returns the column description object for the named attribute.
5675
5676
5677 _Misc_
5678
5679 * Added multi-parameter assignment:
5680
5681 # Instantiate objects for all attribute classes that needs more than one constructor parameter. This is done
5682 # by calling new on the column type or aggregation type (through composed_of) object with these parameters.
5683 # So having the pairs written_on(1) = "2004", written_on(2) = "6", written_on(3) = "24", will instantiate
5684 # written_on (a date type) with Date.new("2004", "6", "24"). You can also specify a typecast character in the
5685 # parenteses to have the parameters typecasted before they're used in the constructor. Use i for Fixnum, f for Float,
5686 # s for String, and a for Array.
5687
5688 This is incredibly useful for assigning dates from HTML drop-downs of month, year, and day.
5689
5690 * Fixed bug with custom primary key column name and Base.find on multiple parameters.
5691
5692 * Fixed bug with dependent option on has_one associations if there was no associated object.
5693
5694
5695 *0.8.3*
5696
5697 _Transactions_
5698
5699 * Added transactional protection for destroy (important for the new :dependent option) [Suggested by Carl Youngblood]
5700
5701 * Fixed so transactions are ignored on MyISAM tables for MySQL (use InnoDB to get transactions)
5702
5703 * Changed transactions so only exceptions will cause a rollback, not returned false.
5704
5705
5706 _Mapping_
5707
5708 * Added support for non-integer primary keys [Aredridel/earlier work by Michael Neumann]
5709
5710 User.find "jdoe"
5711 Product.find "PDKEY-INT-12"
5712
5713 * Added option to specify naming method for primary key column. ActiveRecord::Base.primary_key_prefix_type can either
5714 be set to nil, :table_name, or :table_name_with_underscore. :table_name will assume that Product class has a primary key
5715 of "productid" and :table_name_with_underscore will assume "product_id". The default nil will just give "id".
5716
5717 * Added an overwriteable primary_key method that'll instruct AR to the name of the
5718 id column [Aredridele/earlier work by Guan Yang]
5719
5720 class Project < ActiveRecord::Base
5721 def self.primary_key() "project_id" end
5722 end
5723
5724 * Fixed that Active Records can safely associate inside and out of modules.
5725
5726 class MyApplication::Account < ActiveRecord::Base
5727 has_many :clients # will look for MyApplication::Client
5728 has_many :interests, :class_name => "Business::Interest" # will look for Business::Interest
5729 end
5730
5731 * Fixed that Active Records can safely live inside modules [Aredridel]
5732
5733 class MyApplication::Account < ActiveRecord::Base
5734 end
5735
5736
5737 _Misc_
5738
5739 * Added freeze call to value object assignments to ensure they remain immutable [Spotted by Gavin Sinclair]
5740
5741 * Changed interface for specifying observed class in observers. Was OBSERVED_CLASS constant, now is
5742 observed_class() class method. This is more consistant with things like self.table_name(). Works like this:
5743
5744 class AuditObserver < ActiveRecord::Observer
5745 def self.observed_class() Account end
5746 def after_update(account)
5747 AuditTrail.new(account, "UPDATED")
5748 end
5749 end
5750
5751 [Suggested by Gavin Sinclair]
5752
5753 * Create new Active Record objects by setting the attributes through a block. Like this:
5754
5755 person = Person.new do |p|
5756 p.name = 'Freddy'
5757 p.age = 19
5758 end
5759
5760 [Suggested by Gavin Sinclair]
5761
5762
5763 *0.8.2*
5764
5765 * Added inheritable callback queues that can ensure that certain callback methods or inline fragments are
5766 run throughout the entire inheritance hierarchy. Regardless of whether a descendant overwrites the callback
5767 method:
5768
5769 class Topic < ActiveRecord::Base
5770 before_destroy :destroy_author, 'puts "I'm an inline fragment"'
5771 end
5772
5773 Learn more in link:classes/ActiveRecord/Callbacks.html
5774
5775 * Added :dependent option to has_many and has_one, which will automatically destroy associated objects when
5776 the holder is destroyed:
5777
5778 class Album < ActiveRecord::Base
5779 has_many :tracks, :dependent => true
5780 end
5781
5782 All the associated tracks are destroyed when the album is.
5783
5784 * Added Base.create as a factory that'll create, save, and return a new object in one step.
5785
5786 * Automatically convert strings in config hashes to symbols for the _connection methods. This allows you
5787 to pass the argument hashes directly from yaml. (Luke)
5788
5789 * Fixed the install.rb to include simple.rb [Spotted by Kevin Bullock]
5790
5791 * Modified block syntax to better follow our code standards outlined in
5792 http://www.rubyonrails.org/CodingStandards
5793
5794
5795 *0.8.1*
5796
5797 * Added object-level transactions [Austin Ziegler]
5798
5799 * Changed adapter-specific connection methods to use centralized ActiveRecord::Base.establish_connection,
5800 which is parametized through a config hash with symbol keys instead of a regular parameter list.
5801 This will allow for database connections to be opened in a more generic fashion. (Luke)
5802
5803 NOTE: This requires all *_connections to be updated! Read more in:
5804 http://ar.rubyonrails.org/classes/ActiveRecord/Base.html#M000081
5805
5806 * Fixed SQLite adapter so objects fetched from has_and_belongs_to_many have proper attributes
5807 (t.name is now name). [Spotted by Garrett Rooney]
5808
5809 * Fixed SQLite adapter so dates are returned as Date objects, not Time objects [Spotted by Gavin Sinclair]
5810
5811 * Fixed requirement of date class, so date conversions are succesful regardless of whether you
5812 manually require date or not.
5813
5814
5815 *0.8.0*
5816
5817 * Added transactions
5818
5819 * Changed Base.find to also accept either a list (1, 5, 6) or an array of ids ([5, 7])
5820 as parameter and then return an array of objects instead of just an object
5821
5822 * Fixed method has_collection? for has_and_belongs_to_many macro to behave as a
5823 collection, not an association
5824
5825 * Fixed SQLite adapter so empty or nil values in columns of datetime, date, or time type
5826 aren't treated as current time [Spotted by Gavin Sinclair]
5827
5828
5829 *0.7.6*
5830
5831 * Fixed the install.rb to create the lib/active_record/support directory [Spotted by Gavin Sinclair]
5832 * Fixed that has_association? would always return true [Daniel Von Fange]