rails 操作数据库

Posted 狼王不乖s

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了rails 操作数据库相关的知识,希望对你有一定的参考价值。

数据库操作

1.生成新的记录
①使用new构造函数

>> article = Article.new=> #<Article id: nil, title: nil, body: nil, published_at: nil, created_at: nil,
updated_at: nil, excerpt: nil, location: nil>>> article.new_record?
=> true>> article.attributes=> "body"=>nil, "created_at"=>nil, "excerpt"=>nil, "location"=>nil,"published_at"=>nil, "title"=>nil, "updated_at"=>nil     

>> article.title = 'RailsConf'=> "RailsConf">> article.body = 'RailsConf is the official gathering for Rails developers..'=> "'RailsConf is the official gathering for Rails developers..">> article.published_at = '2013-04-13'=> "2013-04-13">> article=> #<Article id: nil, title: "RailsConf", body: "RailsConf is the official
gathering for Rails devel...", published_at: "2013-04-13 00:00:00",
created_at: nil, updated_at: nil, excerpt: nil, location: nil>>> article.save
(0.1ms) begin transactionSQL (2.2ms) INSERT INTO "articles" ("body", "created_at", "published_at","title", "updated_at") VALUES (?,?,?,?,?) [["body", "RailsConf is the official
gathering for Rails developers.."], ["created_at", Sat, 13 Apr 2013 15:50:29 UTC+00:00], ["published_at", Wed, 13 Apr 2013 00:00:00 UTC +00:00], ["title","RailsConf"], ["updated_at", Sat, 13 Apr 2013 15:50:29 UTC +00:00]]
(2.9ms) commit transaction=> true>> Article.count=> 1>> article.new_record?
=> false>> article = Article.new>> article.title
= "Introduction to SQL">> article.body
= "SQL stands for Structured Query Language, ..">> article.published_at
= Date.today>> article.save>> article = Article.new(:title => "Introduction to Active Record",:body => "Active Record is Rails's default ORM..", :published_at => Date.today)>> article.save

②使用create方法

>> Article.create(:title => "RubyConf 2013", :body => "The annual RubyConf will
take place in..", :published_at => '2013-04-13')=> #<Article id: 4, title: "RubyConf 2013", body: "The annual RubyConf will take
place in..", published_at: "2013-04-13 00:00:00", created_at: "2013-04-13
23:17:19", updated_at: "2013-04-13 23:17:19", excerpt: nil, location: nil>>> attributes =  :title => "Rails Pub Nite", :body=> "Rails Pub Nite is every
3rd Monday of each month, except in December.", :published_at => "2013-04-13"=> :title=>"Rails Pub Nite", :body=>"Rails Pub Nite is every
3rd Monday of each month, except in December.", :published_at=>" 2013-04-13">> Article.create(attributes)=> #<Article id: 5, title: "Rails Pub Nite", body: "Rails Pub Nite is every 3rd
Monday of each month, e...", published_at: "2013-04-13 00:00:00",
created_at: "2013-04-13 23:36:07", updated_at: "2013-04-13 23:36:07",
excerpt: nil, location: nil>     >> Article.count=> 5

③使用id查询单条记录

>> Article.find(3)=> #<Article id: 3, title: "Introduction to Active Record", body: "Active Record
is Rails's default ORM..", published_at: "2013-04-13 04:00:00",
created_at: "2013-04-13 23:15:37", updated_at: "2013-04-13 23:15:37",
excerpt: nil, location: nil>>>article = Article.find(3)=>#<Article id: 3 ...>>>article.id=>3>>article.title=>"Introduction to Active Record"

④使用first和last查询单条记录

>> Article.first
=> #<Article id: 1, title: "RailsConf", body: "RailsConf is the officialgathering for Rails devel...", published_at: "2013-04-13 00:00:00",
created_at: "2013-04-13 23:12:09", updated_at: "2010-04-13 23:12:09",
excerpt: nil, location: nil>
>> Article.last
=> #<Article id: 5, title: "Rails Pub Nite", body: "Rails Pub Nite is every 3rd
Monday of each month, e...", published_at: "2013-04-13 00:00:00",
created_at: "2013-04-13 23:36:07", updated_at: "2013-04-13 23:36:07",
excerpt: nil, location: nil>

⑤查询多条记录

>> articles = Article.all=> [#<Article id: 1,..> #<Article id: 2,..>, #<Article id: 3,..>,#<Article id: 4,..> , #<Article id: 5,..>]>> articles.class=> Array>> articles.size=> 5>> articles[0]=> #<Article id: 1, title: "RailsConf", body: "RailsConf is the official
gathering for Rails devel...", published_at: "2013-04-13 00:00:00",
created_at: "2013-04-13 23:12:09", updated_at: "2013-04-13 23:12:09",
excerpt: nil, location: nil>>> articles[0].title=> "RailsConf">> articles.first.title=> "RailsConf">> articles.each  |article| puts article.title RailsConfIntroduction to SQLIntroduction to Active RecordRubyConf 2010Rails Pub Nite=> [#<Article id: 1,..> #<Article id: 2,..>, #<Article id: 3,..>,#<Article id: 4,..> , #<Article id: 5,..>]

⑥使用order对数据进行排序
默认是降序,我们可以使用DESC改变为升序

>> articles = Article.order("published_at")=> [#<Article id: 1,..> #<Article id: 2,..>, #<Article id: 3,..>,#<Article id: 4,..> , #<Article id: 5,..>]>> articles.each |article| puts article.published_at 2013-04-13 00:00:00 UTC2013-04-13 04:00:00UTC2013-04-13 04:00:00 UTC2013-04-13 00:00:00 UTC2013-04-13 00:00:00 UTC=> [#<Article id: 1,..> #<Article id: 2,..>, #<Article id: 3,..>,#<Article id: 4,..> , #<Article id: 5,..>]>> articles = Article.order ('published_at DESC')=> [#<Article id: 4,..> #<Article id: 5,..>, #<Article id: 2,..>,#<Article id: 3,..> , #<Article id: 1,..>]>> articles.each |article| puts article.published_at 2013-04-13 00:00:00 UTC2013-04-13 00:00:00UTC2013-04-13 00:00:00 UTC2013-04-13 00:00:00 UTC2013-04-13 00:00:00 UTC=> [#<Article id: 4,..> #<Article id: 5,..>, #<Article id: 2,..>,#<Article id: 3,..> , #<Article id: 1,..>]

⑦条件查询

>> Article.where(:title => 'RailsConf').first=> #<Article id: 1, title: "RailsConf", body: "RailsConf is the official
gathering for Rails devel...", published_at: "2013-04-13 00:00:00",
created_at: "2013-04-13 23:12:09", updated_at: "2013-04-13 23:12:09",
excerpt: nil, location: nil>>> Article.where(:title => 'RailsConf').all=> [#<Article id: 1, title: "RailsConf", body: "RailsConf is the official
gathering for Rails devel...", published_at: "2013-04-13 00:00:00",
created_at: "2013-04-13 23:12:09", updated_at: "2013-04-13 23:12:09",
excerpt: nil, location: nil>]>> Article.where(:title => 'Unknown').all=> []

⑧更新记录

>> article = Article.first>> article.title = "Rails 4 is great">> article.published_at = Time.now>> article.save=> true

也可以一次性更新多个字段

>> article = Article.first>> article.update_attributes(:title => "RailsConf2013", :published_at => 1.day.ago)=> true

或者更新一个字段

>> article = Article.first>> article.update_attribute(:title => "RailsConf2013")=> true

⑨删除记录

 >> article = Article.last    >> article.destroy    => #<Article id: 5, title: "Rails Pub Nite", body: "Rails Pub Nite is every 3rd
    Monday of each month, e...", published_at: "2013-04-13 00:00:00",
    created_at: "2013-04-13 23:36:07", updated_at: "2013-04-13 23:36:07",
    excerpt: nil, location: nil>
    #或者在一行里面操作
    >> Article.last.destroy    >> Article.destroy(1)    => [#<Article id: 1, title: "RailsConf", body: "RailsConf is the official
    gathering for Rails devel...", published_at: "2010-02-27 00:00:00",
    created_at: "2010-05-01 23:12:09", updated_at: "2010-05-01 23:12:09",
    excerpt: nil, location: nil>]#删除多条记录>> Article.destroy([2,3])=> [#<Article id: 2, ..>, #<Article id: 3, ..>]

使用destroy是没有返回值的,如果需要返回值,我们可以使用delete方法来删除记录

>> Article.delete(4)=> 1#数据库中不存在5到6的记录,所以返回0>> Article.delete([5, 6])=> 0

规定条件删除相应的记录

>> Article.delete_all("published_at < '2011-01-01'")>> 0

1.在我们的模型中添加下面方法

class Article < ActiveRecord::Base
     validates_presence_of :title
     validates_presence_of :body

     def long_title         "#title - #published_at"
     endend

我们就使用上面的方法来操作数据库了

#在命令行中操作模型>> Article.create :title => 'Advanced Active Record', :published_at => Date.today,:body => 'Models need to relate to each other. In the real world, ...'=> #<Article id: 6, title: "Advanced Active Record", ...>>> Article.last.long_title=> "Advanced Active Record - 2013-04-22 04:00:00 UTC"

2.数据库之间的关系
①一对一关系
首先:我们创建两张表
rails generate model User email:string password:string
rails generate model Profile user_id:integer name:string birthday:date bio:text color:string twitter:string
我们分别在两个模型中创建对应的方法

#User模型class User < ActiveRecord::Basehas_one :profileend#Profile模型class Profile < ActiveRecord::Basebelongs_to :userend

我们接下来可以在rails命令行中做测试了

>> user = User.create(:email => 'user@example.com', :password => 'secret')=> #<User id: 1, email: "user@example.com", password: "secret",
created_at: "2013-04-02 15:10:07", updated_at: "2013-04-02 15:10:07">>> profile = Profile.create(:name => 'John Doe',:bio => 'Ruby developer trying to learn Rails')=> #<Profile id: 1, user_id: nil, name: "John Doe", birthday: nil,
bio: "Ruby developer trying to learn Rails", color: nil, twitter: nil,
created_at: "2013-04-02 15:10:55", updated_at: "2013-04-02 15:10:55"> >> user.profile=> nil>> user.profile = profile=> #<Profile id: 1, user_id: 1, name: "John Doe", birthday: nil,
bio: "Ruby developer trying to learn Rails", color: nil, twitter: nil,
created_at: "2013-04-02 15:10:55", updated_at: "2013-04-02 15:10:55">>> user.profile=> #<Profile id: 1, user_id: 1, name: "John Doe", birthday: nil,
bio: "Ruby developer trying to learn Rails", color: nil, twitter: nil,
created_at: "2013-04-02 15:10:55", updated_at: "2013-04-02 15:10:55">>> user.create_profile :name => 'Jane Doe', :color => 'pink'=> #<Profile id: 2, user_id: 1, name: "Jane Doe", birthday: nil,
bio: nil, color: "pink", twitter: nil, created_at: "2013-04-02 15:18:57",
updated_at: "2013-04-02 15:18:57">

一对一模型中常用方法总结如下:
user.profile 返回user对应的profile对象
user.profile=(profile)对user的profile赋值
user.profile.nil? 返回user的profile是否为空,为空返回真
user.build_profile(attributes=) 返回一条新的user的profile对象,但是不会保存到数据库,需要使用user.profile.save来保存
user.create_profile(attributes=)返回user的profile对象,直接保存到数据库中

②一对多关系
我们使用user表对应article表,每个用户都有很多的文章,但是每篇文章都只对应一个用户
rails generate migration add_user_id_to_articles user_id:integer

#文章表模型class Article < ActiveRecord::Base
    validates_presence_of :title
    validates_presence_of :body
    belongs_to :user#每篇文章指定属于用户
    def long_title        "#title - #published_at"
    endend#用户表   class User < ActiveRecord::Base
    has_one :profile
    has_many :articlesend

我们在rails命令 行中使用示例

>> user = User.first=> #<User id: 1, email: "user@example.com", password: "secret",
created_at: "2013-04-02 15:10:07", updated_at: "2013-04-02 15:10:07">>> user.articles=> []>> user.articles << Article.first=> [#<Article id: 6, ..., user_id: 1>]>> user.articles.size=> 1>> user.articles=> [#<Article id: 6, ..., user_id: 1>]>> Article.first.user_id=> 1>> Article.first.user=> #<User id: 1, email: "user@example.com", password: "secret",
created_at: "2013-04-02 15:10:07", updated_at: "2013-04-02 15:10:07">

一对多常用方法
user.articles 返回用户模型中所有文章对象
user.articles=(articles) 替换用户模型的所有文章对象,用articles来代替
user.articles << article 添加article对象到user的文章对象中
user.articles.delete(articles) 删除文章模型中的一篇或者多篇文章
user.articles.empty? 判断用户实例的文章是否是空的
user.articles.size 返回用户示例的文章数量
user.article_ids 返回用户示例的文章id,以数组形式返回
user.articles.clear 清空用户的文章
user.articles.find 传入文章的id,返回该文章
user.articles.build(attributes=) 创建一个新的用户文章对象,不会保存,需要使用user.articles.last.save来保存
PS:这种方法一般在实际的应用是这样子使用的

product = Product.find(params[:product_id])@line_item = @cart.line_items.build(product: prodcut)#将产品实例直接传进来respond_to do |format|  if @line_item.save#使用它来保存

user.articles.create(attributes=) 直接创建文章对象,并且保存到数据库中。

③关系型数据库扩展
i.定义默认排序

#指定单个的排序class User < ActiveRecord::Base
    has_one :profile
    has_many :articles, ->  order('published_at DESC') end#指定多个字段排序class User < ActiveRecord::Base
    has_one Rails排序宝石

Rails 脚手架 scss 每次生成脚手架时都会重置

无论我使用哪种顺序,Rails 5 中的引导/jQuery 加载顺序都会中断

hive order by是升序还是降序

Rails 应用程序在 localhost 上运行,但每当我检查 Web 浏览器时都会被拒绝连接

最短无序连续子数组

(c)2006-2024 SYSTEM All Rights Reserved IT常识