ActionPack 1.12.0 ActiveRecord 1.14.0 ActiveSupport 1.3.0 | RailTies 1.1.0 Prototype 1.5.0 Scriptaculous 1.6.0 |
Neues in ActiveRecord 1.14.0Scott Raymond sagt
AssoziationenDrei Glanzlichter der neuen Version: has_many :throughEnglische Erklärungen dazu gibt es im Rails-Wiki und auf matthewman.net. Beispiel:class Author < ActiveRecord::Base has_many :authorships has_many :books, :through => :authorships end class Book < ActiveRecord::Base has_many :authorships has_many :authors, :through => :authorships end class Authorship < ActiveRecord::Base belongs_to :author belongs_to :book end Author.find(:first).books.find(:all, :include => :reviews) Polymorphe AssoziationenSiehe Understanding Polymorphic Associations. Polymorphe Assoziationen werden gebraucht, wenn ein Model class Address < ActiveRecord::Base belongs_to :addressable, :polymorphic => true end class User < ActiveRecord::Base has_one :address, :as => :addressable end class Company < ActiveRecord::Base has_one :address, :as => :addressable end Realisiert wird dieses Beispiel mit einer zusätzlichen Spalte :through + :polymorphic = ?
Standardoptionen...für Zum Beispiel: class Post has_many :recent_comments, :class_name => "Comment", :limit => 10, :include => :author end post.recent_comments.find(:all) # benutzt LIMIT 10 und läd authors mit post.recent_comments.find(:all, :limit => nil) # benutzt kein LIMIT, läd aber authors mit :dependentDie
Validationsvalidate_uniqueness_of über mehrere SpaltenEin Lehrer kann pro Schuljahr nur eine Klasse unterrichten:class LehrPlan < ActiveRecord::Base validates_uniqueness_of :lehrer_id, :scope => [:jahr, :klasse_id] end SonstigesKaskadierendes Eager-LoadingAnfragen wie Beispiel: Author.find :all, :include => {:posts=>:comments} Author.find :all, :include => [ {:posts=>:comments}, :categorizations ] Author.find :all, :include => { :posts => [:comments, :categorizations] } Company.find :all, :include => { :groups => {:members=>:favorites} } Verschachteltes with_scopeSiehe API-Dokumentation und habtm.com. Developer.with_scope(:find => { :conditions => "salary > 10000", :limit => 10 }) do Developer.find(:all) #-> SELECT * FROM developers WHERE (salary > 10000) LIMIT 10 # inner rule is used. (all previous parameters are ignored) Developer.with_exclusive_scope(:find => { :conditions => "name = 'Jamis'" }) do Developer.find(:all) #-> SELECT * FROM developers WHERE (name = 'Jamis') end # parameters are merged Developer.with_scope(:find => { :conditions => "name = 'Jamis'" }) do Developer.find(:all) #-> SELECT * FROM developers WHERE (( salary > 10000 ) AND ( name = 'Jamis' )) LIMIT 10 end end BerechnungenFür einfache Berechnungen braucht man nun kein SQL mehr: Person.count :all, :conditions => ["age > ?", 26] Person.average :age Person.minimum :salary Person.maximum :age Person.sum :salary, :group => :last_name XML-Repräsentationen für Recordstopic.to_xml topic.to_xml :skip_instruct => true, :skip_attributes => [:id, bonus_time, :written_on, replies_count] firm.to_xml :include => [:account, :clients] Im Zusammenspiel mit den Fixture-UnterverzeichnisseFixtures können jetzt in Unterverzeichnissen von test/fixtures gespeichert werden. Ideal zum Organisieren von Fixtures für STI.
|