| Path: | vendor/activerecord/CHANGELOG |
| Last Update: | Fri Aug 06 14:53:13 CEST 2004 |
*0.9.3*
If set to true all the associated object are deleted in one SQL statement without having their before_destroy callback run. This should only be used on associations that depend solely on this class and don't need to do any clean-up in before_destroy. The upside is that it's much faster, especially if there's a counter_cache involved.
*0.9.2*
*0.9.1*
class Event < ActiveRecord::Base
has_one_and_belongs_to_many :sponsors
end
class Sponsor < ActiveRecord::Base
has_one_and_belongs_to_many :sponsors
end
Earlier, you’d have to use synthetic methods for creating associations between two objects of the above class:
roskilde_festival.add_to_sponsors(carlsberg) roskilde_festival.remove_from_sponsors(carlsberg) nike.add_to_events(world_cup) nike.remove_from_events(world_cup)
Now you can use regular array-styled methods:
roskilde_festival.sponsors << carlsberg roskilde_festival.sponsors.delete(carlsberg) nike.events << world_cup nike.events.delete(world_cup)
class Post < ActiveRecord::Base
has_many :comments
end
class Comment < ActiveRecord::Base
belongs_to :post
end
You could do something like:
funny_comment.has_post? # => true announcement.comments.delete(funny_comment) funny_comment.has_post? # => false
*0.9.0*
class Post < ActiveRecord::Base
has_many :comments
end
class Comment < ActiveRecord::Base
belongs_to :post
end
Iterating over 100 posts like this:
<% for post in @posts %>
<%= post.title %> has <%= post.comments_count %> comments
<% end %>
Will generate 100 SQL count queries — one for each call to post.comments_count. If you instead add a "comments_count" int column to the posts table and rewrite the comments association macro with:
class Comment < ActiveRecord::Base
belongs_to :post, :counter_cache => true
end
Those 100 SQL count queries will be reduced to zero. Beware that counter caching is only appropriate for objects that begin life with the object it’s specified to belong with and is destroyed like that as well. Typically objects where you would also specify :dependent => true. If your objects switch from one belonging to another (like a post that can be move from one category to another), you’ll have to manage the counter yourself.
class Project < ActiveRecord::Base
has_one :manager
end
class Manager < ActiveRecord::Base
belongs_to :project
end
Earlier, assignments would work like following regardless of which way the assignment told the best story:
active_record.manager_id = david.id
Now you can do it either from the belonging side:
david.project = active_record
…or from the having side:
active_record.manager = david
If the assignment happens from the having side, the assigned object is automatically saved. So in the example above, the project_id attribute on david would be set to the id of active_record, then david would be saved.
class Project < ActiveRecord::Base
has_many :milestones
end
class Milestone < ActiveRecord::Base
belongs_to :project
end
Earlier, assignments would work like following regardless of which way the assignment told the best story:
deadline.project_id = active_record.id
Now you can do it either from the belonging side:
deadline.project = active_record
…or from the having side:
active_record.milestones << deadline
The milestone is automatically saved with the new foreign key.
user = User.find(1)
user.preferences = { "background" => "black", "display" => large }
user.save
User.find(1).preferences # => { "background" => "black", "display" => large }
Please note that this method should only be used when you don’t care about representing the object in proper columns in the database. A money object consisting of an amount and a currency is still a much better fit for a value object done through aggregations than this new option.
class Song < ActiveRecord::Base
# Uses an integer of seconds to hold the length of the song
def length=(minutes)
write_attribute("length", minutes * 60)
end
def length
read_attribute("length") / 60
end
end
The clever kid will notice that this opens a door to sidestep the automated type conversion by using @attributes directly. This is not recommended as read/write_attribute may be granted additional responsibilities in the future, but if you think you know what you’re doing and aren’t afraid of future consequences, this is an option.
*0.8.4*
Reflection
Misc
# Instantiate objects for all attribute classes that needs more than one constructor parameter. This is done
# by calling new on the column type or aggregation type (through composed_of) object with these parameters.
# So having the pairs written_on(1) = "2004", written_on(2) = "6", written_on(3) = "24", will instantiate
# written_on (a date type) with Date.new("2004", "6", "24"). You can also specify a typecast character in the
# parenteses to have the parameters typecasted before they're used in the constructor. Use i for Fixnum, f for Float,
# s for String, and a for Array.
This is incredibly useful for assigning dates from HTML drop-downs of month, year, and day.
*0.8.3*
Transactions
Mapping
User.find "jdoe" Product.find "PDKEY-INT-12"
class Project < ActiveRecord::Base
def self.primary_key() "project_id" end
end
class MyApplication::Account < ActiveRecord::Base
has_many :clients # will look for MyApplication::Client
has_many :interests, :class_name => "Business::Interest" # will look for Business::Interest
end
class MyApplication::Account < ActiveRecord::Base end
Misc
class AuditObserver < ActiveRecord::Observer
def self.observed_class() Account end
def after_update(account)
AuditTrail.new(account, "UPDATED")
end
end
[Suggested by Gavin Sinclair]
person = Person.new do |p|
p.name = 'Freddy'
p.age = 19
end
[Suggested by Gavin Sinclair]
*0.8.2*
class Topic < ActiveRecord::Base
before_destroy :destroy_author, 'puts "I'm an inline fragment"'
end
Learn more in ../../../classes/ActiveRecord/Callbacks.html
class Album < ActiveRecord::Base
has_many :tracks, :dependent => true
end
All the associated tracks are destroyed when the album is.
*0.8.1*
NOTE: This requires all *_connections to be updated! Read more in: ar.rubyonrails.org/classes/ActiveRecord/Base.html#M000081
*0.8.0*
*0.7.6*