Ruby on Rails,使用new和create创建ActiveRecord对象及他们之间的区别

   2023-02-09 学习力0
核心提示:在前文《Ruby on Rails,使用Rails Console进行ActiveRecord调试》中,我们能够在rails console中访问模型并进行对象创建和入库操作。现在我们来看一看创建和入库操作的一些细节。在rails中,new/save操作和create操作都可以创建ActiveRecord对象并持久化到数

在前文《Ruby on Rails,使用Rails Console进行ActiveRecord调试》中,我们能够在rails console中访问模型并进行对象创建和入库操作。

现在我们来看一看创建和入库操作的一些细节。在rails中,new/save操作和create操作都可以创建ActiveRecord对象并持久化到数据库。他们之间的区别还是比较容易猜测出来的。

没错,new操作负责创建对象并返回,在对对象属性赋值之后,调用save方法,对象被保存到数据库中。

new方法创建对象通过传入参数设置对象属性
手动设置对象属性
save方法将对象保存

create方法相当于把这三步操作整合到了一起,创建对象的同时根据参数对对象属性赋值,并把它保存到数据库中,返回更新了数据库属性的对象实例。

创建对象
通过传入的参数设置对象属性
将对象保存

之前创建的Subject只是简单的继承了ActiveRecord,没有任何字段。在前文《Ruby on Rails,数据库迁移命令和迁移任务编写》中介绍过创建迁移任务为模型增加字段很容易。我们增加两个字段name和position,迁移任务创建完成后别忘了执行迁移操作使其生效。

E:\greensoft\RailsInstaller\Sites\simple_cms>rails generate migration add_name_to_subject name:string
      invoke  active_record
      create    db/migrate/20120904162306_add_name_to_subject.rb

E:\greensoft\RailsInstaller\Sites\simple_cms>rails generate migration add_position_to_subject position:string
      invoke  active_record
      create    db/migrate/20120904162329_add_position_to_subject.rb

E:\greensoft\RailsInstaller\Sites\simple_cms>rake db:migrate
==  AddNameToSubject: migrating ===============================================
-- add_column(:subjects, :name, :string)
   -> 0.4890s
==  AddNameToSubject: migrated (0.4960s) ======================================

==  AddPositionToSubject: migrating ===========================================
-- add_column(:subjects, :position, :string)
   -> 0.1870s
==  AddPositionToSubject: migrated (0.1930s) ==================================

rails会自动探测数据库的结构,所以不需要向Subject中增加name和position的定义。现在的Subject内容如下

class Subject < ActiveRecord::Base
end

先用new/save的方法保存看看。通过带参数的new方法设置name属性(也可以不传入参数,不对属性进行设置),通过回显可以看出name属性已经被设置。请注意id属性是数据库的主键,现在是nil(空)意味着这个对象是处于游离状态的,通过new_record?方法看一看,果然true。接着可以设置对象的属性,我把position设置为“coder”(命苦啊。。。)。save方法将对象保存,回显显示保存成功。这时候再查看一下new_record?方法,结果false说明对象已经是持久化状态了。这时候,id属性已经被更新为2,因为上一篇中向数据库中保存过一次Subject,所以这次在上一次的基础上自增1。

irb(main):007:0> subject=Subject.new(:name=>"abbuggy")
=> #<Subject id: nil, created_at: nil, updated_at: nil, name: "abbuggy", position: nil>
irb(main):008:0> subject.new_record?
=> true
irb(main):009:0> subject.position="coder"
=> "coder"
irb(main):010:0> subject.save
  [1m[36m (0.0ms)[0m  [1mBEGIN[0m
  [1m[35mSQL (10.0ms)[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 (24.0ms)[0m  [1mCOMMIT[0m
=> true
irb(main):011:0> subject.new_recorde?
=> false
irb(main):012:0> subject.id
=> 2
irb(main):013:0>

下面使用create方法创建和保存对象。这时候想设置属性得一次成功了,因为create方法结束时对象就已经持久化到数据库里面了。方法的返回值既是持久化对象,id更新为3。

irb(main):014:0> subject2=Subject.create(:name=>"terry",:position=>"manager")
  [1m[35m (0.0ms)[0m  BEGIN
  [1m[36mSQL (19.0ms)[0m  [1mINSERT INTO `subjects` (`created_at`, `name`, `position`, `updated_at`) VALUES ('2012-0
9-04 17:27:31', 'terry', 'manager', '2012-09-04 17:27:31')[0m
  [1m[35m (23.0ms)[0m  COMMIT
=> #<Subject id: 3, created_at: "2012-09-04 17:27:31", updated_at: "2012-09-04 17:27:31", name: "terry", position: "mana
ger">

看来一般还是使用new/save的方式多一些吧,不过create方式对于通过命令向数据库中插入若干记录的场景还是比较方便的。

 
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • [ruby on rails] 跟我学之(6)显示指定数据
    根据《[ruby on rails] 跟我学之路由映射》,我们知道,可以访问 GET    /posts/:id(.:format) 来显示具体的对象。 修改 app/controllers/posts_controller.rb的show这个action。这里有个难题,如果获取url里面的参数?可以通过params内置变量进行访问
    03-16
  • [ruby on rails] 跟我学之(10)数据输入验证
    这里简单加上几个验证,非空,最小长度,唯一修改app/models/post.rb文件,如下:class PostActiveRecord::Base#attr_accessible :title, :contentvalidates :title, :context, :presence = truevalidates :title, :length = { :minimum =2}validates :title,
    03-16
  • 我尝试使用 Ruby 和 mittsu 库制作 3D 战斗动作游戏
    我尝试使用 Ruby 和 mittsu 库制作 3D 战斗动作
    概述这篇文章是关于我偶然发现的 hitbox 的回忆录。2022 夏季鲁比训练营创造了这个游戏。我的游戏仓库这里是。我们作为一个团队开发,有 4 名成员第一次见面,并第一次使用 Git 和 Github 进行开发。使用的技术是Ruby,三通图书馆是。我主要负责碰撞检测,所
    03-16
  • 我只是想在我的 Mac 上将 Ruby 和 Rails 更新到终端中的最新版本。 .
    我只是想在我的 Mac 上将 Ruby 和 Rails 更新到
    介绍自从我尝试创建一个简单的应用程序以来已经有很长时间了,并且我尝试在创建它之前将 Ruby 和 Rails 更新到最新版本,但是我意外卡住了,所以我将它作为备忘录留下。作为版本升级1. 更新 Homebrew 和 rbenv2. 红宝石更新3. Rails 更新这就是它的感觉。让我
    03-16
  • ruby写爬虫 ruby python
    ruby写爬虫 ruby python
    http://www.javaeye.com/topic/545160爬虫性能比较http://www.rubyrailways.com/data-extraction-for-web-20-screen-scraping-in-rubyrails/srcapihttp://huacnlee.com/blog/ruby-scrapi-collect-koubei  2009年4月22日 星期三用ruby写的一个网络爬虫程序前
    03-08
  • 一个关于创建一个可以用 Ruby 做 UMAP 的 gem 的故事
    一个关于创建一个可以用 Ruby 做 UMAP 的 gem
    介绍统一流形逼近和投影 (UMAP) 是一种通过降维的可视化方法,通常与 t-SNE 一起使用。用 Ruby 语言执行机器学习时,瘤胃我认为有很多情况下你使用 gem 调用。瘤胃有t-SNE但不是UMAP。这一次,它是一个 C++ 库乌马普的红宝石绑定我创造了它,所以我会在我忘记
    03-08
  • 让我们制作一个应用程序,当您在表格①中输入名称时输出 PDF 戳记(使用 Ruby on Rails 创建 PDF 文件)
    让我们制作一个应用程序,当您在表格①中输入名
    介绍你好!我的名字是荣查本。这次在Ruby on Rails中实现PDF转换的时候,用到了一个叫Prawn的gem,所以总结了一下。您可以通过阅读本文创建フォームに名前を入力するとPDF化された印鑑を出力するアプリ。即使是我,一个初学者也可以做到,所以实现方法很简单
    03-08
  • [脚本_Ruby]Windows安装配置Ruby On Rails
    感觉Java学的差不多了,想接触下Ruby On Rails,看看它比Java WEB高效到哪里了,在Ubuntu12.10上弄了两天总是报错提示没有指向的文件sqlite3,不管怎么安装sqlite3都不行,到最后没办法只有跑到WIN7平台下试试,以下就是我搭建Ruby On Rails的过程:    
    02-10
  • Prawn:Ruby生成PDF更简捷的选择
    在InfoQ上看到《Prawn:使用Ruby生成PDF更简捷》,其说到的Prawn可以更加快捷的在Ruby中生成PDF文件。因为之前使用过很多版本的PDF生成类库都不尽如人意,有的太复杂,有的太慢,于是对这个做了测试。1、安装安装很简单,直接使用gem install prawn即可安装完
    02-10
  • Ruby On Rails:InstanRails
    参考数据:对于Ruby On Rails 不是粉清楚的朋友可以参考以下的连结信息,该连结网站都提供不错的Ruby On Rails 信息。Ruby: 一个纯OO的脚本语言..Ruby on Rails: 快速建置Web的MVC架构的Framework说明:整合环境: Instant Rails 是在Windows环境中,整合了Ruby,
    02-10
点击排行