ActiveRecord


1.         Table and class

By default,Active Record assumes that the name of the table is the plural form of the name of the class.But you can specify the name of the table which the class is corresponding in class with ‘set_table_name’ method or ‘table_name’ property. For example:

class Sheep < ActiveRecord::Base

set_table_name "sheep" # Not "sheeps"

end

class Order < ActiveRecord::Base

set_table_name "ord_rev99_x" # Wrap a legacy table...

end

class Sheep < ActiveRecord::Base

self.table_name = "sheep"

end

2.         APIs of ActiveRecord::Base

All these methods are Singleton method,so you should access these methods though neither an instance, nor the class.

(1)column_names:return all the name of columns in an array.

(2)column_hash[“column_name”]:return the detail of this column

(3)find(primay_key):If given just one primary key,it returns an object containing data for the corresponding row(or throws a RecordNotFound exception).If given multiple primary key values,find returns an array of the corresponding objects.

(4)primay_key:If you override the primary key column’s name with ‘primary_key’ method when you create a table,you can use this property to specify the primary key.For example:

class Book < ActiveRecord::Base

       self.primary_key = “column_name”

end

 

3.         Boolean Attribute

To query a column as a Boolean value in a condition,you must append a question mark to the column’s name.

4.         Connecting to the Database

One way of specifying the connection is to use the establish_connection class method.For example:

ActiveRecord::Base.establish_connection(

       :adapter   => “mysql”,

       :host       => “dbserver.com”

       :database => “railsdb”,

       :username=> “user”,

       :password=> “password”

)

5.         Connections and Models

Connections are associated with model classes.Each class inherits the connection of its parent.Because ActiveRecord::Base is the base class of all the Active Record classes,setting a connection for it sets the default connection for all the Active Record Classes you define.However,you can override this when you need to do so.

ActiveRecord::Base.establish_connection(

:adapter => "mysql" ,

:host => "dbserver.com" ,

:database => "online" ,

:username => "groucho" ,

:password => "swordfish" )

class LineItem < ActiveRecord::Base

# ...

end

class Order < ActiveRecord::Base

# ...

end

class Product < ActiveRecord::Base

# ...

end

class Customer < ActiveRecord::Base

establish_connection(

:adapter => "mysql" ,

:host => "dbserver.com" ,

:database => "backend" ,

:username => "chicho" ,

:password => "piano" )

# ...

end

aFinally,you can combine the two approaches(use establish_connection method or configure in database.yml file).If you pass a symbol to establish_connection, Rails looks for a section in database.yml with that name and bases the connection on the parameters found there.This way you can keep all connection details out of your code.

6.         CRUD

(1)    Create

use ‘new’ method to create an object and call the ‘save’ method of this object to save the data into database.

Active Record constructors take an optional block.If present,the block is invoked with the newly created order as a parameter.This might be useful if you wanted to create and save away an order without creating a new local variable.

Active Record constructors accept a hash of attribute values as an optional parameter. Each entry in this hash corresponds to the name and value of an attribute to be set.

 

You know that the ‘new’ method creates a new object in memory,we have to invoke ‘save’ method to save the data into database.Active Record has a convenience method,create, that both instantiates the model object and stores it into the database.

You can pass create an array of attribute hashes;it’ll create multiple rows in database and return an array of the corresponding model objects.

 

The real reason that new and create take a hash of values is that you can construct model objects directly from form parameters.For example:

order = Order.new(params[:order])

(2)    Read

l         find:

If given just one primary key,it returns an object containing data for the corresponding row(or throws a RecordNotFound exception).If given multiple primary key values,find returns an array of the corresponding objects.

:first and :all --The :first variant of find returns the first row that matches a set of criteria, while the :all form eturns an array of matching rows.

:condition—determines which rows are returned by the find;it corresponds to an SQL where clause.

how to generate dynamic SQL:

One way of specifying placeholders is to insert one or more question marks in the SQL.The first question mark is replaced by the second element of the array,the next question mark by the third,and so on.For example:

name = params[:name]

pos = Order.find(:all,

:conditions => ["name = ? and pay_type = 'po'" , name])

                 You can alse use named placeholders.

                     name = params[:name]

pay_type = params[:pay_type]

pos = Order.find(:all,

:conditions => ["name = :name and pay_type = :pay_type" ,

{:pay_type => pay_type, :name => name}])

:order—The :order parameter lets you specify the criteria you’d normally and after the order by keywords.

:limit—You can limit the number of rows returned.

:offset—The :offset parameter goes hand in hand with the :limit parameter.It allows you to specify the the offset of the first row in the result set that will be returned.For example:

def Order.find_on_page(page_num, page_size)

find(:all,

:order => "id" ,

:limit => page_size,

:offset => page_num*page_size)

end

:joins—The :joins parameter to the finder method lets you specify a list of additional tables to be joined to the default table.

:select—The :select parameter takes a string which will appear in the place of the * in the select statement.

:readonly—If :readonly is set to true,Active Record objects returned by find cannot be stored back in to database.If you use the :joins or :select options,objects will automatically be marked :readonly.

:form—The :form option lets you override the table name inserted into the select clause.

:group—The :group option adds a group by clause to the SQL generated by find.

:lock—The :lock option takes either a string or the constrant true.

l         find_by_sql

The method find_by_sql lets your application take full control.

l         Column Statistics

average(:column_name)

maximum(:column_name)

minimum(:column_name)

sum(:column_name)

count

All the functions take a hash of options,very similar to the hash that can be passed to find.

:conditions

:joins

:limit

:order

:having

:select

:distinct(for count only)

l         Dynamic Finders

If you invoke a model’s class method where the method name starts find_by_ or find_all_by_,Active Record converts it to a finder,using the rest of the method’s name to determine the column to be checked. find_by_XXX is converted to find(:first,:conditions=>XXX…).Similary,find_all_by_XXX is converted into matching find(:all,…) calls.

find_by_name_and_password(name,pw)

(3)    Updating Existing Rows

update_attribute(Object method) can be called by an object which exists in database.

update(Class method) need pass the id into this method

update_all(Class method) update all rows

(4)    Deleting Rows

delete—The delete method takes a single id or an array of ids and deletes the corresponding row(s) in the underlying table.

delete_all—The delete_all method deletes rows matching a given condition(or all rows if no condition is specified).

destroy

destroy_all

7.         Composing Data with Aggregations

You define a class to hold the data,and you add a declaration to the model class telling it to map the database column(s) to and from objects of the dataholder class.

composed_of :attr_name, :class_name => SomeClass, :mapping => mapping

發佈了26 篇原創文章 · 獲贊 0 · 訪問量 1849
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章