~michaelforrest/use-case-mapper/trunk

« back to all changes in this revision

Viewing changes to vendor/rails/activerecord/CHANGELOG

  • Committer: Richard Lee (Canonical)
  • Date: 2010-10-15 15:17:58 UTC
  • mfrom: (190.1.3 use-case-mapper)
  • Revision ID: richard.lee@canonical.com-20101015151758-wcvmfxrexsongf9d
Merge

Show diffs side-by-side

added added

removed removed

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