mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Improvements for Association Basics.
Add active links to internal sections. Use textile markup for particular words. Improve the indentation in code examples. Fix some typos.
This commit is contained in:
parent
d7a5db2885
commit
3bfbbeb79d
1 changed files with 25 additions and 25 deletions
|
@ -233,7 +233,7 @@ class CreateSuppliers < ActiveRecord::Migration
|
|||
end
|
||||
</ruby>
|
||||
|
||||
NOTE: Using +t.integer :supplier_id+ makes the foreign key naming obvious and implicit. In current versions of Rails, you can abstract away this implementation detail by using +t.references :supplier+ instead.
|
||||
NOTE: Using +t.integer :supplier_id+ makes the foreign key naming obvious and explicit. In current versions of Rails, you can abstract away this implementation detail by using +t.references :supplier+ instead.
|
||||
|
||||
h4. Choosing Between has_many :through and has_and_belongs_to_many
|
||||
|
||||
|
@ -268,7 +268,7 @@ class Part < ActiveRecord::Base
|
|||
end
|
||||
</ruby>
|
||||
|
||||
The simplest rule of thumb is that you should set up a +has_many :through+ relationship if you need to work with the relationship model as an independent entity. If you don't need to do anything with the relationship model, it may be simpler to set up a +has_and_belongs_to_many+ relationship (though you'll need to remember to create the joining table).
|
||||
The simplest rule of thumb is that you should set up a +has_many :through+ relationship if you need to work with the relationship model as an independent entity. If you don't need to do anything with the relationship model, it may be simpler to set up a +has_and_belongs_to_many+ relationship (though you'll need to remember to create the joining table in the database).
|
||||
|
||||
You should use +has_many :through+ if you need validations, callbacks, or extra attributes on the join model.
|
||||
|
||||
|
@ -335,12 +335,12 @@ end
|
|||
|
||||
h4. Self Joins
|
||||
|
||||
In designing a data model, you will sometimes find a model that should have a relation to itself. For example, you may want to store all employees in a single database model, but be able to trace relationships such as manager and subordinates. This situation can be modeled with self-joining associations:
|
||||
In designing a data model, you will sometimes find a model that should have a relation to itself. For example, you may want to store all employees in a single database model, but be able to trace relationships such as between manager and subordinates. This situation can be modeled with self-joining associations:
|
||||
|
||||
<ruby>
|
||||
class Employee < ActiveRecord::Base
|
||||
has_many :subordinates, :class_name => "Employee",
|
||||
:foreign_key => "manager_id"
|
||||
:foreign_key => "manager_id"
|
||||
belongs_to :manager, :class_name => "Employee"
|
||||
end
|
||||
</ruby>
|
||||
|
@ -358,7 +358,7 @@ Here are a few things you should know to make efficient use of Active Record ass
|
|||
|
||||
h4. Controlling Caching
|
||||
|
||||
All of the association methods are built around caching that keeps the result of the most recent query available for further operations. The cache is even shared across methods. For example:
|
||||
All of the association methods are built around caching, which keeps the result of the most recent query available for further operations. The cache is even shared across methods. For example:
|
||||
|
||||
<ruby>
|
||||
customer.orders # retrieves orders from the database
|
||||
|
@ -415,9 +415,9 @@ If you create an association some time after you build the underlying model, you
|
|||
|
||||
h5. Creating Join Tables for has_and_belongs_to_many Associations
|
||||
|
||||
If you create a +has_and_belongs_to_many+ association, you need to explicitly create the joining table. Unless the name of the join table is explicitly specified by using the +:join_table+ option, Active Record create the name by using the lexical order of the class names. So a join between customer and order models will give the default join table name of "customers_orders" because "c" outranks "o" in lexical ordering.
|
||||
If you create a +has_and_belongs_to_many+ association, you need to explicitly create the joining table. Unless the name of the join table is explicitly specified by using the +:join_table+ option, Active Record creates the name by using the lexical order of the class names. So a join between customer and order models will give the default join table name of "customers_orders" because "c" outranks "o" in lexical ordering.
|
||||
|
||||
WARNING: The precedence between model names is calculated using the +<+ operator for +String+. This means that if the strings are of different lengths, and the strings are equal when compared up to the shortest length, then the longer string is considered of higher lexical precedence than the shorter one. For example, one would expect the tables "paper_boxes" and "papers" to generate a join table name of "papers_paper_boxes" because of the length of the name "paper_boxes", but it in fact generates a join table name of "paper_boxes_papers".
|
||||
WARNING: The precedence between model names is calculated using the +<+ operator for +String+. This means that if the strings are of different lengths, and the strings are equal when compared up to the shortest length, then the longer string is considered of higher lexical precedence than the shorter one. For example, one would expect the tables "paper_boxes" and "papers" to generate a join table name of "papers_paper_boxes" because of the length of the name "paper_boxes", but it in fact generates a join table name of "paper_boxes_papers" (because the underscore '_' is lexicographically _less_ than 's' in common encodings).
|
||||
|
||||
Whatever the name, you must manually generate the join table with an appropriate migration. For example, consider these associations:
|
||||
|
||||
|
@ -466,7 +466,7 @@ module MyApplication
|
|||
end
|
||||
</ruby>
|
||||
|
||||
This will work fine, because both the +Supplier+ and the +Account+ class are defined within the same scope. But this will not work, because +Supplier+ and +Account+ are defined in different scopes:
|
||||
This will work fine, because both the +Supplier+ and the +Account+ class are defined within the same scope. But the following will _not_ work, because +Supplier+ and +Account+ are defined in different scopes:
|
||||
|
||||
<ruby>
|
||||
module MyApplication
|
||||
|
@ -695,7 +695,7 @@ TIP: In any case, Rails will not create foreign key columns for you. You need to
|
|||
|
||||
h6. :include
|
||||
|
||||
You can use the :include option to specify second-order associations that should be eager-loaded when this association is used. For example, consider these models:
|
||||
You can use the +:include+ option to specify second-order associations that should be eager-loaded when this association is used. For example, consider these models:
|
||||
|
||||
<ruby>
|
||||
class LineItem < ActiveRecord::Base
|
||||
|
@ -733,7 +733,7 @@ NOTE: There's no need to use +:include+ for immediate associations - that is, if
|
|||
|
||||
h6. :polymorphic
|
||||
|
||||
Passing +true+ to the +:polymorphic+ option indicates that this is a polymorphic association. Polymorphic associations were discussed in detail earlier in this guide.
|
||||
Passing +true+ to the +:polymorphic+ option indicates that this is a polymorphic association. Polymorphic associations were discussed in detail <a href="#polymorphic-associations">earlier in this guide</a>.
|
||||
|
||||
h6. :readonly
|
||||
|
||||
|
@ -859,7 +859,7 @@ The +has_one+ association supports these options:
|
|||
|
||||
h6. :as
|
||||
|
||||
Setting the +:as+ option indicates that this is a polymorphic association. Polymorphic associations are discussed in detail later in this guide.
|
||||
Setting the +:as+ option indicates that this is a polymorphic association. Polymorphic associations were discussed in detail <a href="#polymorphic-associations">earlier in this guide</a>.
|
||||
|
||||
h6. :autosave
|
||||
|
||||
|
@ -903,7 +903,7 @@ TIP: In any case, Rails will not create foreign key columns for you. You need to
|
|||
|
||||
h6. :include
|
||||
|
||||
You can use the :include option to specify second-order associations that should be eager-loaded when this association is used. For example, consider these models:
|
||||
You can use the +:include+ option to specify second-order associations that should be eager-loaded when this association is used. For example, consider these models:
|
||||
|
||||
<ruby>
|
||||
class Supplier < ActiveRecord::Base
|
||||
|
@ -963,7 +963,7 @@ The +:source_type+ option specifies the source association type for a +has_one :
|
|||
|
||||
h6. :through
|
||||
|
||||
The +:through+ option specifies a join model through which to perform the query. +has_one :through+ associations are discussed in detail later in this guide.
|
||||
The +:through+ option specifies a join model through which to perform the query. +has_one :through+ associations were discussed in detail <a href="#thehas-onethrough-association">earlier in this guide</a>.
|
||||
|
||||
h6. :validate
|
||||
|
||||
|
@ -1056,7 +1056,7 @@ WARNING: Objects will be in addition destroyed if they're associated with +:depe
|
|||
|
||||
h6. <em>collection</em>=objects
|
||||
|
||||
The <tt><em>collection</em></tt>= method makes the collection contain only the supplied objects, by adding and deleting as appropriate.
|
||||
The <tt><em>collection</em>=</tt> method makes the collection contain only the supplied objects, by adding and deleting as appropriate.
|
||||
|
||||
h6. <em>collection_singular</em>_ids
|
||||
|
||||
|
@ -1159,7 +1159,7 @@ The +has_many+ association supports these options:
|
|||
|
||||
h6. :as
|
||||
|
||||
Setting the +:as+ option indicates that this is a polymorphic association, as discussed earlier in this guide.
|
||||
Setting the +:as+ option indicates that this is a polymorphic association, as discussed <a href="#polymorphic-associations">earlier in this guide</a>.
|
||||
|
||||
h6. :autosave
|
||||
|
||||
|
@ -1211,7 +1211,7 @@ NOTE: This option is ignored when you use the +:through+ option on the associati
|
|||
|
||||
h6. :extend
|
||||
|
||||
The +:extend+ option specifies a named module to extend the association proxy. Association extensions are discussed in detail later in this guide.
|
||||
The +:extend+ option specifies a named module to extend the association proxy. Association extensions are discussed in detail <a href="#association-extensions">later in this guide</a>.
|
||||
|
||||
h6. :finder_sql
|
||||
|
||||
|
@ -1241,7 +1241,7 @@ end
|
|||
|
||||
h6. :include
|
||||
|
||||
You can use the :include option to specify second-order associations that should be eager-loaded when this association is used. For example, consider these models:
|
||||
You can use the +:include+ option to specify second-order associations that should be eager-loaded when this association is used. For example, consider these models:
|
||||
|
||||
<ruby>
|
||||
class Customer < ActiveRecord::Base
|
||||
|
@ -1324,7 +1324,7 @@ The +:source_type+ option specifies the source association type for a +has_many
|
|||
|
||||
h6. :through
|
||||
|
||||
The +:through+ option specifies a join model through which to perform the query. +has_many :through+ associations provide a way to implement many-to-many relationships, as discussed earlier in this guide.
|
||||
The +:through+ option specifies a join model through which to perform the query. +has_many :through+ associations provide a way to implement many-to-many relationships, as discussed <a href="#thehas-manythrough-association">earlier in this guide</a>.
|
||||
|
||||
h6. :uniq
|
||||
|
||||
|
@ -1366,7 +1366,7 @@ When you declare a +has_and_belongs_to_many+ association, the declaring class au
|
|||
* <tt><em>collection</em>.build(attributes = {})</tt>
|
||||
* <tt><em>collection</em>.create(attributes = {})</tt>
|
||||
|
||||
In all of these methods, <tt><em>collection</em></tt> is replaced with the symbol passed as the first argument to +has_many+, and <tt><em>collection_singular</em></tt> is replaced with the singularized version of that symbol.. For example, given the declaration:
|
||||
In all of these methods, <tt><em>collection</em></tt> is replaced with the symbol passed as the first argument to +has_and_belongs_to_many+, and <tt><em>collection_singular</em></tt> is replaced with the singularized version of that symbol.. For example, given the declaration:
|
||||
|
||||
<ruby>
|
||||
class Part < ActiveRecord::Base
|
||||
|
@ -1443,7 +1443,7 @@ The <tt><em>collection_singular</em>_ids=</tt> method makes the collection conta
|
|||
|
||||
h6. <em>collection</em>.clear
|
||||
|
||||
The <tt><em>collection</em>.clear</tt> method removes every object from the collection by deleting the rows from the joining tableassociation. This does not destroy the associated objects.
|
||||
The <tt><em>collection</em>.clear</tt> method removes every object from the collection by deleting the rows from the joining table. This does not destroy the associated objects.
|
||||
|
||||
h6. <em>collection</em>.empty?
|
||||
|
||||
|
@ -1487,7 +1487,7 @@ The <tt><em>collection</em>.build</tt> method returns a new object of the associ
|
|||
|
||||
h6. <em>collection</em>.create(attributes = {})
|
||||
|
||||
The <tt><em>collection</em>.create</tt> method returns a new object of the associated type. This objects will be instantiated from the passed attributes, the link through the join table will be created, and the associated object _will_ be saved (assuming that it passes any validations).
|
||||
The <tt><em>collection</em>.create</tt> method returns a new object of the associated type. This object will be instantiated from the passed attributes, the link through the join table will be created, and the associated object _will_ be saved (assuming that it passes any validations).
|
||||
|
||||
<ruby>
|
||||
@assembly = @part.assemblies.create(
|
||||
|
@ -1496,7 +1496,7 @@ The <tt><em>collection</em>.create</tt> method returns a new object of the assoc
|
|||
|
||||
h5. Options for has_and_belongs_to_many
|
||||
|
||||
In many situations, you can use the default behavior for +has_and_belongs_to_many+ without any customization. But you can alter that behavior in a number of ways. This section cover the options that you can pass when you create a +has_and_belongs_to_many+ association. For example, an association with several options might look like this:
|
||||
In many situations, you can use the default behavior for +has_and_belongs_to_many+ without any customization. But you can alter that behavior in a number of ways. This section covers the options that you can pass when you create a +has_and_belongs_to_many+ association. For example, an association with several options might look like this:
|
||||
|
||||
<ruby>
|
||||
class Parts < ActiveRecord::Base
|
||||
|
@ -1590,7 +1590,7 @@ Normally Rails automatically generates the proper SQL to remove links between th
|
|||
|
||||
h6. :extend
|
||||
|
||||
The +:extend+ option specifies a named module to extend the association proxy. Association extensions are discussed in detail later in this guide.
|
||||
The +:extend+ option specifies a named module to extend the association proxy. Association extensions are discussed in detail <a href="#association-extensions">later in this guide</a>.
|
||||
|
||||
h6. :finder_sql
|
||||
|
||||
|
@ -1620,7 +1620,7 @@ end
|
|||
|
||||
h6. :include
|
||||
|
||||
You can use the :include option to specify second-order associations that should be eager-loaded when this association is used.
|
||||
You can use the +:include+ option to specify second-order associations that should be eager-loaded when this association is used.
|
||||
|
||||
h6. :insert_sql
|
||||
|
||||
|
@ -1637,7 +1637,7 @@ The +:limit+ option lets you restrict the total number of objects that will be f
|
|||
<ruby>
|
||||
class Parts < ActiveRecord::Base
|
||||
has_and_belongs_to_many :assemblies, :order => "created_at DESC",
|
||||
:limit => 50
|
||||
:limit => 50
|
||||
end
|
||||
</ruby>
|
||||
|
||||
|
|
Loading…
Reference in a new issue