• Rails中的增删改查


     

     

    1.        rails中类与对象与SQL中表与行的关系

    rails中提供了对象关系映射(ORM),将模型类映射至表,模型类的关联表名是类名小写后的复数形式,如类名Order,对应的表名为orders;若类名包含多个大写单词,则应在单词之间使用下划线划分表名,如类名为TaxAgency,对应的表名为taxagencies。

    rails中将模型类的对象对应于表中的行,对象的属性对应于表中的字段。

    例:

    Sql代码 

    createtable users( 

       id int auto_increment primary key, 

       username varchar(20), 

       password varchar(20) 

    ); 

    在model目录下创建user.rb,内容如下

    Ruby代码 

    classUser < ActiveRecord::Base 

    end 

    这样就为表与User类建立起了映射关系。其中表的username对应User类的username属性,表的其他字段也同样在User中作为其对象属性。

    2.        查询字段名清单,查询字段的详细信息

    User.column_names       # [“id”, “username”, “password”, ”creat_at”,“update_at”]

    注:Active Record提供了一些附加字段,如

    creat_at:行记录创建的时间

    update_at:行记录更新的时间

    creat_on:行记录创建的日期

    update_on:行记录更新的日期)

    type:查询每一行属于哪个子类

    id:主键字段的默认名

    User.column_hash[“username”]  # @sql_type=” varchar(20)”,@null=true,等

    3.        更改主键名

    class Order < ActiveRecord::Base

             self.primary_key= “num”

    end

    例:

    ord = Order.new

    ord.id = 1

    ord.username = “tom”

    ord.password = “tom”

    ord.save            #作更改之后需要save一下,才能保证表中的行与对象同步

             ord =Order.find(1)     #通过id进行查找,返回匹配的行,若不存在,返回nil

             ord.username       #tom

             ord.attributes     #{“num” => ”1”, “username”=>”tom”, “password”=>”tom”}

    注:若两个模型对象是同一个类的实例,且具有相同的主键,rails认为其相等(==)。

    4.        模型之间的关联性

    1)        一对一关联(一对零或一对一)

    指通过一个表中的任何一行的外键引用到另一个表中最多一行的记录,如每个位子最多坐一个人

    class Person < ActiveRecord::Base

             belongs_to:chair

    end

    class Chair < ActiveRecord::Base

             has_one:person

    end

    2)        一对多关联

    如一个书柜可以放很多书

    class Book <ActiveRecord::Base

             belongs_to :bookcase

    end

    class BookCase< ActiveRecord::Base

             has_many:books

    end

    3)        多对多关联

    如一本书可以属于多个类别,每个类别可以包含多本书

    class Book < ActiveRecord::Base

                                has_and_belongs_many:categories

                       end

                       classCategory < ActiveRecord::Base

                                has_and_belongs_many:books

                       end

             rails使用中间连接表来实现多对多关联,中间连接表包含连接两个目标表的外键,表名为表1_表2,如categories_books.

    5.        创建新的行记录

    1)        new  创建实例模型对象

    (必须调用save,将内容存至数据库,否则数据只存在于本地计算机)

    a)        ord = Order.new

    ord.id = 1

    ord.username = “tom”

    ord.password = “tom”

    ord.save   

    b)        Order.new do | ord |

    ord.id =1

    ord.username= “tom”

    ord.password= “tom”

    ord.save

    end

    c)        ord = Order.new(

    :id  => 1,

    :username => “tom”,

    :passname => “tom”)

    ord.save

    2)        create 创建实例模型对象的同时将其存储到数据库中

    a)        ord = Order. create(

    :id  => 1,

    :username => “tom”,

    :passname => “tom”)

    b)        ord = Order. create(

    [{:id  => 1,

    :username => “tom”,

    :passname => “tom”},

    {:id  =>2,

    :username => “lili”,

    :passname => “;lili”}])    #同时创建多行记录

    6.        查询

    1)        find(一个或多个主键)

    若只有一个主键,则返回包含相应行记录数据的一个对象或是抛出RecordNotFound异常;若包含多个主键,则返回相应对象的数组,若有1个未找到,仍抛出异常。

    例:

    an_order = Order.find(1)    #返回id=1的对象

    2)        find_by_(find_first_by)、find_last_by_、find_all_by_

    Order.find_by_id(num)    #查找第一个id=num的对象,不存在时返回nil

    Order.find_by_id!(num)    #查找第一个id=num的对象,不存在时抛出

    RecordNotFound异常

    Order.find_last_by_id(num)    #查找最后一个id=num的对象,不存在时返回nil

    Order.find_last_by_id!(num)    #查找最后一个id=num的对象,不存在时抛出

    RecordNotFound异常

    Order.find_all_by_id(num)   #查找所有的id=num的对象,以数组的形式返回,不

                                                              存在时返回nil

    Order.find_all_by_id!(num)    #查找所有的id=num的对象,以数组的形式返回,

                                                                     不存在时抛出RecordNotFound异常

    id处可以是类属性中的任意一个,也可多个属性同时查询,如

    find_by_id_and_password(num, pw)

    3)        where

    如:

    Order.where(:id=>1, :username => “tom”)

    Order.where(“ id=1 and username=’tom’ ”)

    username =params[:username]

    Order.where(“ id=1 and username=’#{ username }’ ”)

    Order.where([“ id=1 and username=? ”, username])

    Order.where(“ id=1 and username=:username ”, { :username => username})

    Order.where(“ id=:id and username=:username ”, params[:order])

    Order.where(id= params[:id], username= params[:username])

    Order.where(“ username like ? ”, params[:username]+%)

    7.        返回记录的子集

    1)        order     

    Order.where(:username => “tom”).order(“id”)  #查出username为tom的对象,并按

                                                                                                 id的升序排列

    2)        limit                   

    Order.where(:username => “tom”).order(“id”).limit(5)

    #查出username为tom的对象,并按id的升序排列返回前5个

    3)        offset       

    #指定第一行的偏移量

    4)        first

    Order.where(:username => “tom”).order(“id”).first 

    #查出username为tom的对象,并按id的升序排列,返回第一个对象

    8.        select、group方法

    Order. select(“id”, ”username”)  

    Order. select(“id”, ”username”).where(“password =”pw””)

    Order. select(“id”, ”username”) .where(“password =”pw””).group(”username”)

    9.        统计函数

    average(字段名):求平均值

    maximum:最大值

    minimum:最小值

    sum:求和

    count:计数

    10.    执行sql语句

    find_by_sql(sql语句)

    11.    attributes、attribute_names、attribute_present?

    attributes:返回属性名/值对的hash对象

    attribute_names:返回name属性值组成的数组

    attribute_present?:检验某个属性是否有效

    例:

    orders = Order.find_by_sql(“select id, username from ord”)

    first = orders[0]

    first. attributes      # {“id”=>1, “username”=>”tom”, “password”=>”tom”}

    first. attribute_names    # [“id”, “username”, “password”]

    first. attribute_present?(“press”)    #false

    12.    更新现有行

    1)        save、save!

    ord = Order.find(1)

    ord.username = “Tom”

    ord.save

    save若保存成功返回true,否则返回nil

    save!若保存成功返回true,否则返回异常

    2)        update_attribute

    ord = Order.find(1)

    ord. update_attribute(:username, “Tom”)

    ord. update_attribute(:username=> “Tom”, :password=>”psp”)

    3)        update

    Order.update(1, :username=> “Tom”, :password=>”psp” )

    4)        update_all

    Order.update_all (“password=psp” )

    13.    删除行记录

    1)        delete

    ord.delete(1)      #删除id为1的记录

    2)        delete_all           

    ord. delete_all([“username=’tom’”])     #删除给定条件的记录

    3)        destroy

    ord.destory

             delete方法绕过了ActiveRecord模块的各种回调和验证函数,而destory方法确保了调用他们的所有的一切过程。

  • 相关阅读:
    高中数学相关的专业术语
    数学-高数2
    python+unittest+xlrd+request搭建API测试框架
    接口自动化,断言方法,深度定位错误
    python+requests+unittest API接口测试
    python+unittest框架整理(一点点学习前辈们的封装思路,一点点成长。。。)
    学习python的第一个小目标:通过requests+xlrd实现简单接口测试,将测试用例维护在表格中,与脚本分开。
    队列 —— 先入先出的数据结构
    卷积神经网络的简单可视化
    HOG 特征提取算法(实践篇)
  • 原文地址:https://www.cnblogs.com/wangyuyu/p/3235746.html
Copyright © 2020-2023  润新知