rails generate model photo title:string album:references

这会产生一个album_id列,当建立belongs_to关联时,需要用到。

references算时一种结构,会产生integer.

For integer, string, text and binary fields, an integer in curly braces will be set as the limit:  `rails generate model user pseudo:string{30}`
For decimal, two integers separated by a comma in curly braces will be used for precision and scale: rails generate model product 'price:decimal{10,2}'
You can add a `:uniq` or `:index` suffix for unique  
        `rails generate model user pseudo:string:uniq`
        `rails generate model user pseudo:string:index`
You can combine any single curly brace option with the index options:
        `rails generate model user username:string{30}:uniq`

Database Configuration

config/database.yml中可以看到默认的数据库配置。

development:
  <<: *default
  database: db/development.sqlite3

使用sqlite3+路径, 进入控制台。

$ sqlite3 db/development.sqlite3
SQLite version 3.14.0 2016-07-26 15:17:14
Enter ".help" for usage hints.
sqlite> .tables #显示所有表格
ar_internal_metadata  products
countries             schema_migrations
sqlite> .schema countries #打印创建表格的命令。
CREATE TABLE "countries" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar, "population" integer, "created_at" datetime NOT NULL, "updated_at" datetime NOT NULL);

在rails console建立一条记录,可以通过底层数据库sqlite3查看:

$ sqlite3 db/development.sqlite3

> select * from countries;

1|Cermany|81831000|2018-06-15 07:39:00.370425|2018-06-15 

表示成功。


一次创建多条数据需要使用一个数组的hashes。

Country.create([{name: "China"}, {name:"France"}])

Country.all返回得到一个数组的Country。它是一个ActiveRecord::Relation scope object

因此,Country.all可以使用each方法。


rails db:drop 删除数据库。rails db:create, rails db:migrate三剑客。

rails db:seed建立种子文件。


find , where

使用查询方法的使用,如果是多条,必然返回一个Array。

Country.find(1)返回的是一个单独的object,他的类是Country

Country.find([1])返回的则是一个集合[],他的类是 Array

这里用到了between..and..

> Album.where(release_year:1960..1966).count
   (0.2ms)  SELECT COUNT(*) FROM "albums" WHERE "albums"."release_year" BETWEEN ? AND ?  [["release_year", 1960], ["release_year", 1966]]
=> 5

这里使用了and连接了2个between..and..

> Album.where(release_year:1960..1966,  id: 1..5).count
   (0.2ms)  SELECT COUNT(*) FROM "albums" WHERE "albums"."release_year" BETWEEN ? AND ? AND "albums"."id" BETWEEN ? AND ?  [["release_year", 1960], ["release_year", 1966], ["id", 1], ["id", 5]]
=> 4

这里使用了in, 用于精确的指定查询条件

> Album.where(release_year:[1966, 1968]).count
   (0.1ms)  SELECT COUNT(*) FROM "albums" WHERE "albums"."release_year" IN (?, ?)  [["release_year", 1966], ["release_year", 1968]]
=> 4

这里order by 和 ASC, limit

> Album.where(release_year:[1966, 1968]).first   
  Album Load (0.2ms)  SELECT  "albums".* FROM "albums" WHERE "albums"."release_year" IN (?, ?) ORDER BY "albums"."id" ASC LIMIT ?  [["release_year", 1966], ["release_year", 1968], ["LIMIT", 1]]
=> #<Album:0x00007ffd8cb9b388...>

所有查询语法,条件都可以使用?, (?, ?)代替,在语法最后使用Array,按顺序列出具体条件。


not ,or

这里使用了!=

> Album.where.not(release_year: 1968).count
   (0.1ms)  SELECT COUNT(*) FROM "albums" WHERE "albums"."release_year" != ?  [["release_year", 1968]]
=> 9

这里使用了数据库的or,另外rails语法,or()方法连接的应该是同一个数据库

> Album.where(release_year:1967).or(Album.where(name: "The Beathles")).count

(0.2ms)  SELECT COUNT(*) FROM "albums" WHERE ("albums"."release_year" = ? OR "albums"."name" = ?)  [["release_year", 1967], ["name", "The Beathles"]]⚠️和 Album.where(release_year:1960..1966, id: 1..5).count   的区别


自定义SQL,使用find_by_sql()方法。


模糊查找like, >= , <=

> Album.where("name like ?", "%on%").count
   (0.1ms)  SELECT COUNT(*) FROM "albums" WHERE (name like '%on%')
=> 5
> Album.where('release_year > ?', 1964).count
   (0.2ms)  SELECT COUNT(*) FROM "albums" WHERE (release_year > 1964)
=> 10

使用了AND

> Album.where("name like ? AND release_year > ?", '%on%', 1970).count
   (0.1ms)  SELECT COUNT(*) FROM "albums" WHERE (name like '%on%' AND release_year > 1970)
=> 3

使用了local variable在语法内部用了#{}插入符号

> Album.where("name like ?", "%#{search_string}%").count
   (0.2ms)  SELECT COUNT(*) FROM "albums" WHERE (name like '%ing%')
=> 2

链式查询:limit

这里用到limit方法限制查询记录数量。

Ablum.where(release_year: 1965..1968).order(:release_year).limit(3)

=>SELECT  "albums".* FROM "albums" WHERE "albums"."release_year" BETWEEN ? AND ? ORDER BY "albums"."release_year" ASC LIMIT ?  [["release_year", 1965], ["release_year", 1968], ["LIMIT", 3]]


自动的优化查询:

因为order对sum来说是无关紧要的查询条件。所以SQL没有使用order查询。

> Album.where(release_year: 1970..1979).order(:name).sum(:release_year)
 =>  (42.5ms)  SELECT SUM("albums"."release_year") FROM "albums" WHERE "albums"."release_year" BETWEEN ? AND ?  [["release_year", 1970], ["release_year", 1979]]
=> 5922

reverse_order和 order

reverse_order反转查询顺序。

Album.where(release_year: 1960..1969).order(:name).reverse_order


Pluck()方法

从检索的记录中挑出需要的字段。

这里返回一个Array,包含了所以符合查询条件的记录的名字。

可以挑出多个字段,返回嵌套数组。

> Album.where(release_year: 1960..1969).pluck(:name)
    SELECT "albums"."name" FROM "albums" WHERE "albums"."release_year" BETWEEN ? AND ?  [["release_year", 1960], ["release_year", 1969]]
=> ["Sgt. Pepper's Lonely Hearts Club Band",
 "Pet Sounds",
 "Revolver",
 "Highway 61 Revisited",
 "Rubber Soul",
 "Blonde on Blonde",
 "The Beatles"]

⚠️Album.pluck(:id)等同于Album.ids


Select()方法 类似pluck()

返回的是一个ActiveRecord::Relation。

> Album.where(release_year: 1960..1969).select(:name)
   SELECT "albums"."name" FROM "albums" WHERE "albums"."release_year" BETWEEN ? AND ?  [["release_year", 1960], ["release_year", 1969]]
=> [#<Album:0x00007ffd8bb808e0 id: nil, name: "Sgt. Pepper's Lonely Hearts Club Band">,
 #<Album:0x00007ffd8bb805c0 id: nil, name: "Pet Sounds">,
 #<Album:0x00007ffd8bb80480 id: nil, name: "Revolver">,
 #<Album:0x00007ffd8bb80340 id: nil, name: "Highway 61 Revisited">,
 #<Album:0x00007ffd8bb80188 id: nil, name: "Rubber Soul">,
 #<Album:0x00007ffd8bb7bed0 id: nil, name: "Blonde on Blonde">,
 #<Album:0x00007ffd8bb7bbb0 id: nil, name: "The Beatles">]

Calculations

average()方法。根据检索的条件,计算平均值,返回BigDecimal.

 > Album.where(release_year: 1960..1969).average(:release_year)
    SELECT AVG("albums"."release_year") FROM "albums" WHERE "albums"."release_year" BETWEEN ? AND ?  [["release_year", 1960], ["release_year", 1969]]
=> 0.196614285714286e4

maximum(), minimum(), sum(),用法一样。

> Album.maximum(:release_year)
   (0.2ms)  SELECT MAX("albums"."release_year") FROM "albums"
=> 1979

SQL EXPLAIN

大型的数据库,EXPLAIN是一个很好的debugging 方法。可以显示详细的信息。

> Album.where(release_year: 1960..1969).explain
  SELECT "albums".* FROM "albums" WHERE "albums"."release_year" BETWEEN ? AND ?  [["release_year", 1960], ["release_year", 1969]]
=> EXPLAIN for: SELECT "albums".* FROM "albums" WHERE "albums"."release_year" BETWEEN ? AND ? [["release_year", 1960], ["release_year", 1969]]
2|0|0|SCAN TABLE albums

批处理:batches

find_each,

find_in_batches: yields batches to 块,作为一个模型的数组。

见其他博客,或guide。


lock_version 乐观锁optimistic

备注:之前看rails的guide以及API, 因为是英文同时没有step to step的案例,一直没有弄明白。因此,如果某个特点在一篇教材上不懂,标记下来,可以通过查找不同的资料,如教材。一个step to step的案例是最方便理解知识点的地方了。

通过乐观锁可以锁定一个数据库的数据。

如果有多个用户同时修改同一条记录,就可能会产生冲突。 加上

Learn Rails5.2- ActiveRecord: sqlite3的用法, Query查询语法。乐观锁和悲观锁案例,查询语法includes(), 多态关联,destory和delete, Scope, Validats, Migrations的更多相关文章

  1. Java 中对象锁和类锁的区别? 关键字 Synchronized的用法?

    一  对象锁和类锁的关系 /* * 对象锁和[类锁] 全局锁的关系? 对象锁是用于对象实例方法,或者一个对象实例上的 this 类锁是用于类的静态方法或者一个类的class对象上的. Ag.class ...

  2. Learn Rails5.2-- rails base(含官方指导Debugging 摘录)

    豆知识扩展: <meta>  https://www.cnblogs.com/chentianwei/p/9183799.html css selector div > p 选择所有 ...

  3. Learn Rails5.2 Bundler ; Forms

    如果一个Rubyer想要提供一个功能或某个程序或程序的集合给其他Rubyer使用,这个Rubyer可以创建一个package,这个package就叫做gems. 可以通过gem install安装. ...

  4. Learn Rails5.2- ActiveRecord: Migration , spring的使用(不兼容的解决办法)

    偶然一次: 运行rails generate停止不动,网上查找答案,可能是bundle update 之后 spring 版本变化了,和正在运行的 spring 实例不兼容. Spring导致的同样的 ...

  5. Learn Rails5.2 Routes。( 很少用到的参数:constraints和redirect)

    Naming a Route get 'home/index', as: "different_name" 会得到prefix: different_name代替home_inde ...

  6. Learn Rails5.2- Scaffolding and REST,flash.now, flash.keep; Access via JSON

    用generator建立一个手脚架 Representational State Transfer (REST).  具像的状态转存. https://en.wikipedia.org/wiki/Re ...

  7. mysql慢查询Slow Query Log和未使用索引(Not Using Indexes)查询配置和使用

    mysql的“慢查询”指的是超过了允许的最大查询时间(long_query_time)的sql语句,而“未使用索引”查询顾名思义就是查询语句没有使用到索引的sql语句. 慢查询配置和使用 在msyql ...

  8. mysql find_in_set 与 in 的用法与区别,mysql范围搜索,mysql范围查询

    mysql find_in_set 与 in 的用法与区别 1.find_in_set 用于模糊查询,并且数据库中的值是用英文逗号分隔的: 例如: (1).去字段中查询 select find_in_ ...

  9. 【sqli-labs】 less61 GET -Challenge -Double Query -5 queries allowed -Variation4 (GET型 挑战 双查询 只允许5次查询 变化4)

    http://192.168.136.128/sqli-labs-master/Less-61/?id=1' 单引号双括号闭合 192.168.136.128/sqli-labs-master/Les ...

随机推荐

  1. 170612、web如何项目优化

    Web性能优化分为服务器端和浏览器端两个方面. 一.浏览器端,关于浏览器端优化,分很多个方面1.压缩源码和图片JavaScript文件源代码可以采用混淆压缩的方式,CSS文件源代码进行普通压缩,JPG ...

  2. 用Squid实现反向代理

    Last-Modified: 告诉反向代理页面什么时间被修改 Expires: 告诉反向代理页面什么时间应该从缓冲区中删除 Cache-Control: 告诉反向代理页面是否应该被缓冲 Pragma: ...

  3. 知乎live 我的读书经验 总结

    https://www.zhihu.com/lives/757587093366009856/messages 碎片化阅读没有意义, 捡硬币捡成富翁 kindle不能全文检索   短篇文章的阅读是否有 ...

  4. 三种空格unicode(\u00A0,\u0020,\u3000)表示的区别

    1.不间断空格\u00A0,主要用在office中,让一个单词在结尾处不会换行显示,快捷键ctrl+shift+space ; 2.半角空格(英文符号)\u0020,代码中常用的; 3.全角空格(中文 ...

  5. ConcurrentHashMap实现解析

    ConcurrentHashMap是线程安全的HashMap的实现,具有更加高效的并发性.与HashTable不同,ConcurrentHashMap运用锁分离技术,尽量减小写操作时加锁的粒度,即在写 ...

  6. python三层架构

    conf/setting(配置文件)    一般是对utility进行相关设置   index(主文件) main函数触发某个对象的业务逻辑方法   model(数据库) admin  是对数据库的操 ...

  7. React Native入门-刘望舒

    React Native入门(一)环境搭建与Hello World React Native入门(二)Atom+Nuclide安装.配置与调试 React Native入门(三)组件的Props(属性 ...

  8. PAT 1055 The World's Richest[排序][如何不超时]

    1055 The World's Richest(25 分) Forbes magazine publishes every year its list of billionaires based o ...

  9. Mybatis的CRUD案例

    一.Mybatis增删改查案例 上一节<Mybatis入门和简单Demo>讲了如何Mybatis的由来,工作流程和一个简单的插入案例,本节主要继上一讲完整的展示Mybatis的CRUD操作 ...

  10. 概率图模型PFM——无向图

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAdYAAAFPCAIAAAB/EXiGAAAgAElEQVR4nO2df4wl1XXn6/+0VuG/II ...