凤凰平台注册开户_凤凰彩票app下载安装_凤凰彩票投注网

热门关键词: 凤凰平台注册开户,凤凰彩票app下载安装,凤凰彩票投注网

不唯有更新中,使用find方法加载持久化对象

作者: 编程知识  发布:2019-09-21

前文《Ruby on Rails,使用new和create创造ActiveRecord对象及他们之间的界别》,《Ruby on Rails,使用save和update_attributes更新持久化的ActiveRecord对象》,《Ruby on Rails,使用destroy方法删除ActiveRecord对象》中,分别介绍了向数据库中成立、更新、删除对象的诀窍。在应用奉行中,从数据库查询对象的空子要远远不仅仅成立、修改、删除的火候。上边来探访怎么样通过find方法加载ActiveRecord对象。

一、CRUD的含义

CRUD是各类多少操作的简称,分别对应的是:

  • C即Create,表示创立资料,并存入数据库
  • 汉兰达即Read,表示读取或彰显数据库中的资料
  • U即Update,表示更新数据库中已部分资料
  • D即Destroy,表示删除数据库中的资料
    下边分别介绍下它们分别的用法

在前文《Ruby on Rails,使用Rails Console进行ActiveRecord调节和测量检验》中,大家能够在rails console中寻访模型并拓宽对象创制和入库操作。

前面我们就早就运用过类似于Subject.find的主意从数据库中加载Subject对象了。那是find的最简便用法,传入主键,获得相应的靶子实例。

二、CRUD的用法

于今我们来看一看创设和入库操作的一些细节。在rails中,new/save操作和create操作都足以创制ActiveRecord对象并悠久化到数据库。他们之间的分别照旧相比轻易揣度出来的。

irb:015:0* subject = Subject.find  [1m[35mSubject Load [0m  SELECT `subjects`.* FROM `subjects` WHERE `subjects`.`id` = 1 LIMIT 1=> #<Subject id: 1, created_at: "2012-10-20 06:14:56", updated_at: "2012-10-20 06:14:56", name: "First Subject", position: nil>irb:016:0>

一、C(创建)

Active Record对象的创始有三种艺术:

  • 使散列(也叫哈希)创设
  • 开创后手动设置属性
  • 在块中开创
    new和create都以创造对象,区别在于:
    new方法创立新目的,但尚无存入数据库
    create方法创设新对象,并将其存入数据库
    下边分别用new和create方法结合二种对象的创始格局在Rails console中来展现创制对象的进度:
    1.使用new方法
    (1)使用散列创设对象
p= Product.new(title: "葡萄",quantiy: 20)

此时成立了三个p对象,但 还向来不存入到数据库:

凤凰彩票app下载安装 1

Snip20180202_2.png

应用p.save将会将对象p的内容存入到数据库,如图:

凤凰彩票app下载安装 2

Snip20180202_3.png

(2)创制对象,然后手动设置属性

a = Product.new
a.title = "苹果"
a.quantity =66

那会儿开立了二个a对象,一同头未有值,前边通过a.title和a.quantity为a对象的性子赋值,如图:

凤凰彩票app下载安装 3

Snip20180202_4.png

选择a.save就可以将a对象存入数据库

(3)使用块创设对象

b = Product.new do |f|
f.title = "橄榄"
f.quantity = 88
end

此时使用块方法成立了b对象,并为b对象赋值,如图:

凤凰彩票app下载安装 4

Snip20180202_5.png

运用b.save就能够将b对象存入数据库。
本来,你能够用new和块方法成立空的b对象,如:

b = Product.new do |f|
end

那样创制的b对象便是空对象

2.使用create方法
(1)使用散列创制对象

c = Product.create(title: "橘子",quantity: 50)

create在创立c对象的还要,将c对象存入数据库,如图:

凤凰彩票app下载安装 5

Snip20180202_6.png

(2)创立对象,然后手动设置属性

d = Product.create
d.title = "柠檬"
d.quantity = 100
d.save

率先利用create制造了三个空的d对象,并存入数据库,接下去对d对象的title和quantity实行赋值,但要注意到是急需选用d.save才干将设定的新的属性值存入数据库

凤凰彩票app下载安装 6

Snip20180202_7.png

凤凰彩票app下载安装 7

Snip20180202_8.png

(3)使用块创造对象

e= Product.create do |f|
f.title = "红树莓"
end

e.quantity = 100
e.save

先用块创设了e对象,同期为title赋值,然后存入数据库。接下来为e对象的quantity属性进行赋值,并使用e.save将新属性值存入到数据库,如图:

凤凰彩票app下载安装 8

Snip20180202_9.png

当然你也足以运用create和块方法创设空的对象,将其存入到数据库中

g = Product.create do |f|
end

如图:

凤凰彩票app下载安装 9

Snip20180202_11.png

正确,new操作负担创设对象并赶回,在对指标属性赋值之后,调用save方法,对象被保留到数据库中。

假如传入的主键id对应的笔录并不设有,将会抛出特别布告"RecordNotFound: Couldn't find Subject with id=2"以便举办持续管理。关于那二个管理在末端会拥有涉及,在此处只要通晓主键查询这种方法有异常的大希望抛出极其就能够。

二、R(读取)

这里介绍常见的二种查询艺术:
(1)all

p = Product.all

将会回到全数product组成的成团

(2)first

p = Product.first

将会回来第一product
也足以对first传入数字,再次回到不超过钦赐数量的询问结果,如:

p = Product.first(4)

将会依据升序再次回到前4个product,若数据库中唯有3条数据(不足4个)结果,则赶回3个product

(3)last

p = Product.last

将会回来最终二个product

也足以对last方法传入数字,重回不超过钦赐数量的询问结果,如:

p = Product.last(4)

将会依照升序情势赶回最终4个product,若数据库中唯有3条数据(不足4个)结果,则赶回3个product

(4)find
行使 find 方法时会检索钦点主键对应的目标,暗中认可的主键一般是id

p = Product.find(3)

回去id为3的product,若空头支票id为3的product,则会并发ActiveRecord::RecordNotFound 格外

也足以用find来搜寻八个目标

p = Product.find([1,3])

重返id为1和id为3的四个product,若不设有对应id的product,则会产出ActiveRecord::RecordNotFound 极度

(5)find_by
能够行使find_by遵照性质进行检索结果,并且只会重返符合条件的结果中的第三个结实

p = Product.find_by(quantity: 20)

将重返全数quantity为20的product,若一纸空文,则赶回nil,不抛出非凡

p = Product.find_by(title: "香蕉")

将重临全部title为金蕉的product,若不设有,则赶回nil,不抛出非常
其余上述代码能够改写成:

p = Product.find_by_quantity(20)
p = Product.find_by_title("香蕉")

find_by的机能一定于where和first的组合使用
必要留神的是:
find_by! 方法的行为和 find_by 方法类似,两个的界别在于一旦未有找到相称的记录,find_by! 方法会抛出 ActiveRecord::RecordNotFound 非常,由此利用!的秘诀(如save!,find_by!,last!等)能够用来祛除bug,搜索出错点

(6)order

p = Product.order("id DESC")

将兼具product依据id举行降序排列

p = Product.order("created_at ASC")

将所有product按照created_at进行升序排列

p = Product.order(:quantity)

将享有product依照quantity栏位属性举行升序排列

(7)where
where查询形式将会回来成分集结,若不设有则赶回空数组[]

p = Product.where(title: "红树莓", quantity: 20)

将会搜索title为高脚波,何况quantity为20的product集合,假使不设有则赶回空数组[]

(8)组合使用
除此而外上边包车型大巴查询艺术能够单个运用,大家也足以结合起来使用,比方:

p = Product.order(:price).find_by(quantity: 20)

那般能够先遵照price对product举行升序排列,然后从中找到quantity为20的prodcut

补充:
在运用上述那一个查询方式的时候,要专一什么是回去成分集结格局的,哪些是回到元素的,并遵守顺序进行结合使用,不然,会发出NoMethodError: undefined method报错,举个例子:

p = Product.find_by(title: "香蕉").last

便是荒谬的用法,因为find_by重返的因素,last方法是对集中使用的,因而准确的用法是:

p = Product.where(title: "香蕉").last(2)

where将回到title为大蕉的要素集结,然后通过last(2)找到集结中的最终七个因素,产生新的数组

由此得以总结为:
(1)重返成分集合的查询办法能够和再次来到成分集合的询问艺术结合使用
(2)重临成分群集的查询格局也足以和再次回到成分的询问办法结合使用,而且重回元素的查询艺术只可以放在再次回到成分集结查询方式的末尾
(3)可是回去成分的查询办法无法和重返成分的询问办法结合使用

更加多询问接口参谋:Active Record 查询接口

new方法创建对象通过传入参数设置对象属性手动设置对象属性save方法将对象保存
irb:019:0* subject = Subject.find  [1m[36mSubject Load [0m  [1mSELECT `subjects`.* FROM `subjects` WHERE `subjects`.`id` = 2 LIMIT 1[0mActiveRecord::RecordNotFound: Couldn't find Subject with id=2        from E:/greensoft/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/activerecord-3.2.1/lib/active_record/relation/finder_methods.rb:340:in `find_one'        from E:/greensoft/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/activerecord-3.2.1/lib/active_record/relation/finder_methods.rb:311:in `find_with_ids'        from E:/greensoft/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/activerecord-3.2.1/lib/active_record/relation/finder_methods.rb:107:in `find'        from E:in `find'        from :19        from E:/greensoft/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/railties-3.2.1/lib/rails/commands/console.rb:47:in `start'        from E:/greensoft/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/railties-3.2.1/lib/rails/commands/console.rb:8:in `start'        from E:/greensoft/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/railties-3.2.1/lib/rails/commands.rb:41:in `<top >'        from script/rails:6:in `require'        from script/rails:6:in `<main>'

三、U(更新)

革新数据库中的资料有以下措施:
(1)使用赋值运算符,然后保留

p = Product.find_by(title: "苹果")
p.title = "石榴"
p.save

上述代码从数据库中寻找title为苹果的那一笔资料,然后修改其title值,最终存入数据库
(2)update_all
update_all是批量革新的法子

p = Product.where(quantity: 20)
p.update_all(quantity: 200)

上述代码捞出数据库中quantity为20的兼具素材,况兼将它们的quantity更新为200
(3)update
(4)update_columns
(5)udpate_attribute
至于选用update,update_all,update_columns,update_attribute更新数据库的详细资料能够参谋笔者的那篇小说:凤凰彩票app下载安装,使用update_columns/update/update_attribute/update_all更新数据库资料
此间就不再赘述。

create方法也正是把那三步操作结合到了一起,创建对象的同一时间遵照参数对指标属性赋值,并把它保存到数据库中,重返更新了数据库属性的目的实例。

由此all方法,可以再次回到全体指标的列表。

四、D(删除)

(1)destroy_all批量删除

p = Product.where(quantity: 200).destory_all

上述代码分别是搜索全部quantity为200的product资料,并将其除去,

q = Product.all.destroy_all

上述代码是去除数据库中享有的product资料

(2)destroy删除一笔资料

p = Product.find_by(title: "柠檬")
p.destroy

上述代码查找title为柠檬的质地,然后删除那一笔资料

注意:
destroy_all是剔除成分集结(能够知晓成多笔资料),destroy是删除元素(一笔资料),不要对find_by等回到成分的措施或单个元素选取destory_all;也休想对where等回到成分群集的方式或因素集结使用destroy,否则都会产生NoMethodError: undefined method报错

创建对象通过传入的参数设置对象属性将对象保存
irb:051:0* Subject.all  [1m[35mSubject Load [0m  SELECT `subjects`.* FROM `subjects`=> [#<Subject id: 1, created_at: "2012-10-20 06:14:56", updated_at: "2012-10-20 06:14:56", name: "First Subject", position: nil>, #<Subject id: 2, created_at: "2012-10-20 06:25:27", updated_at: "2012-10-20 06:25:27", name: "First Subject", position: nil>]

后边成立的Subject只是粗略的持续了ActiveRecord,未有另外字段。在前文《Ruby on Rails,数据库迁移命令和迁移职分编写》中介绍过成立迁移职分为模型扩展字段很轻便。大家扩张三个字段name和position,迁移义务成立达成后别忘了实行迁移操作使其收效。

经过first和last方法,能够分别再次来到数据库中首先个和尾声多个指标。

E:greensoftRailsInstallerSitessimple_cms>rails generate migration add_name_to_subject name:string      invoke  active_record      create    db/migrate/20120904162306_add_name_to_subject.rbE:greensoftRailsInstallerSitessimple_cms>rails generate migration add_position_to_subject position:string      invoke  active_record      create    db/migrate/20120904162329_add_position_to_subject.rbE:greensoftRailsInstallerSitessimple_cms>rake db:migrate==  AddNameToSubject: migrating ===============================================-- add_column(:subjects, :name, :string)   -> 0.4890s==  AddNameToSubject: migrated  ========================================  AddPositionToSubject: migrating ===========================================-- add_column(:subjects, :position, :string)   -> 0.1870s==  AddPositionToSubject: migrated  ==================================
irb:055:0* Subject.first  [1m[36mSubject Load [0m  [1mSELECT `subjects`.* FROM `subjects` LIMIT 1[0m=> #<Subject id: 1, created_at: "2012-10-20 06:14:56", updated_at: "2012-10-20 06:14:56", name: "First Subject", position: nil>irb:056:0> Subject.last  [1m[35mSubject Load [0m  SELECT `subjects`.* FROM `subjects` ORDER BY `subjects`.`id` DESC LIMIT 1=> #<Subject id: 2, created_at: "2012-10-20 06:25:27", updated_at: "2012-10-20 06:25:27", name: "First Subject", position: nil>

rails会自动探测数据库的组织,所以无需向Subject中加进name和position的概念。未来的Subject内容如下

除此以外一种查询对象的点子是类似于Subject.find_by_name("First Subject")的款式,称之为动态查询。在那之中by后边是某二个实行询问的性质的名字,比如Subject的name属性。参数是性质的值,比方“First Subject”。如此调用将会回到name属性值为“First Subject”的Subject对象。

class Subject < ActiveRecord::Baseend
irb:034:0* Subject.find_by_name("First Subject")  [1m[36mSubject Load [0m  [1mSELECT `subjects`.* FROM `subjects` WHERE `subjects`.`name` = 'First Subject' LIMIT 1[0m=> #<Subject id: 1, created_at: "2012-10-20 06:14:56", updated_at: "2012-10-20 06:14:56", name: "First Subject", position: nil>

先用new/save的章程保存看看。通过带参数的new方法设置name属性(也能够不传播参数,不对品质进行设置),通过回显能够见到name属性已经被设置。请稳重id属性是数据库的主键,未来是nil意味着这几个指标是地处游离状态的,通过new_record?方法看一看,果然true。接着能够安装对象的质量,小编把position设置为“coder”。save方法将目的保存,回显展现保存成功。那时候再查看一下new_record?方法,结果false表达对象已经是持久化状态了。那时候,id属性已经被更新为2,因为上一篇中向数据库中保存过贰次Subject,所以本次在上贰回的根基上自增1。

通过find_by_id方法和find方法一致,都是经过id进行查询。

irb:007:0> subject=Subject.new(:name=>"abbuggy")=> #<Subject id: nil, created_at: nil, updated_at: nil, name: "abbuggy", position: nil>irb:008:0> subject.new_record?=> trueirb:009:0> subject.position="coder"=> "coder"irb:010:0> subject.save  [1m[36m [0m  [1mBEGIN[0m  [1m[35mSQL [0m  INSERT INTO `subjects` (`created_at`, `name`, `position`, `updated_at`) VALUES ('2012-09-04 17:07:34', 'abbuggy', 'coder', '2012-09-04 17:07:34')  [1m[36m [0m  [1mCOMMIT[0m=> trueirb:011:0> subject.new_recorde?=> falseirb:012:0> subject.id=> 2irb:013:0>

一旦通过动态查询未有检索到符合条件的指标,与find方法抛出极度分裂,find_by_xx方法只会回来nil表示记录未有找到。

上面采纳create方法创设和封存对象。那时候想设置属性得三回中标了,因为create方法甘休时对象就已经持久化到数据Curry面了。方法的重回值既是长久化对象,id更新为3。

irb:039:0* Subject.find_by_name("Second Subject")  [1m[35mSubject Load [0m  SELECT `subjects`.* FROM `subjects` WHERE `subjects`.`name` = 'Second Subject' LIMIT 1=> nil
irb:014:0> subject2=Subject.create(:name=>"terry",:position=>"manager")  [1m[35m [0m  BEGIN  [1m[36mSQL [0m  [1mINSERT INTO `subjects` (`created_at`, `name`, `position`, `updated_at`) VALUES ('2012-09-04 17:27:31', 'terry', 'manager', '2012-09-04 17:27:31')[0m  [1m[35m [0m  COMMIT=> #<Subject id: 3, created_at: "2012-09-04 17:27:31", updated_at: "2012-09-04 17:27:31", name: "terry", position: "manager">

使用find_by_xx方法只会回来第四个符合条件的对象,所以一般的话那些情势许多用于探测一下数据库中有钦命属性等于特定值的靶子。要想取得符合条件的有着目的,供给将find_by和all组合在一块,使用find_all_by_xx。

总的来讲一般依然使用new/save的格局多一些呢,不过create形式对于通过命令向数据库中插入若干记录的现象依然相比有利的。

irb:060:0* Subject.find_all_by_name("First Subject")  [1m[36mSubject Load [0m  [1mSELECT `subjects`.* FROM `subjects` WHERE `subjects`.`name` = 'First Subject'[0m=> [#<Subject id: 1, created_at: "2012-10-20 06:14:56", updated_at: "2012-10-20 06:14:56", name: "First Subject", position: nil>, #<Subject id: 2, created_at: "2012-10-20 06:25:27", updated_at: "2012-10-20 06:25:27", name: "First Subject", position: nil>]

请留神find体系的章程都以实时加载的,也正是说调用方法的同不平时间就能够与数据库交互举办询问。后边会讲到能够应用懒加载的不二等秘书技。find_by_xx方法即使能够实行规范过滤,不过回到的结果是贰个列表,失去了再进一步过滤的本领。在Rails3.2事后就活该都转发使用where方法开展标准过滤查询了。

本文由凤凰平台注册开户发布于编程知识,转载请注明出处:不唯有更新中,使用find方法加载持久化对象

关键词:

上一篇:没有了
下一篇:没有了